эквивалент *args в R и суммирование функции с самой собой

avatar
moth
9 августа 2021 в 03:04
48
1
0

Скажем, у меня есть функция binomial.coeff, определенная как:

combn <- function(n,r) {
  factorial(n)/(factorial(r)*factorial(n-r))
}

binomial.coeff <- function(n,x,p) {
  combn(n,x)*p^x*(1-p)^(n-x)
}

Я хотел бы вызвать функцию binomial.coeff для разных значений x и суммировать вызовы для получения результата. Я не уверен, что R принимает много позиционных аргументов, например:

binomial.coeff <- function(n,... p) {
    combn(n,...)*p^...*(1-p)^(n-...)
}

Моя конечная цель: скажем, x принимает значения [3,2], тогда я хотел бы, чтобы функция суммировалась с 3 and 2

binomial.coeff <- function(n,x,p) {
  combn(n,3)*p^3*(1-p)^(n-3)+combn(n,2)*p^2*(1-p)^(n-2)
}
Источник

Ответы (1)

avatar
MrFlick
9 августа 2021 в 03:43
2

Поскольку вы используете функции, которые сами векторизованы, вы можете передать вектор для x с помощью

binomial.coeff(3,2:3,.25)
# [1] 0.140625 0.015625

и суммируем с

sum(binomial.coeff(3,2:3,.25))
# [1] 0.15625

В более общем случае, если вы хотите вызвать его несколько раз с разными значениями параметров, в R вы должны использовать что-то вроде sapply. Например

sapply(2:3, function(x) binomial.coeff(3, x, .25))
# [1] 0.140625 0.015625
sum(sapply(2:3, function(x) binomial.coeff(3, x, .25)))
# [1] 0.15625

Но код, который вы написали, кажется, является PMF для биномиального распределения. Для этого есть встроенная функция dbinom Вы можете сделать то же самое с

dbinom(2:3, 3, .25)
# [1] 0.140625 0.015625
sum(dbinom(2:3, 3, .25))
# [1] 0.15625

за один вызов, потому что dbinom векторизуется по аргументу x. Также эта версия будет более эффективной.

moth
9 августа 2021 в 03:52
0

удивительно, спасибо. но есть ли эквивалент *args Python в R, т.е. могу ли я передать неопределенное количество аргументов функции?

MrFlick
9 августа 2021 в 03:55
1

Если вы используете ..., вы можете захватить все эти значения с помощью args<- c(...) или args <- list(...), но вы не можете так же легко вводить эти значения в новые вызовы функций с помощью базы R. В основном вам нужно использовать do.call() для сборки вызов функции. В пакете rlang, используемом tidyverse, есть опции для расширения параметров с помощью !!!, но эту функцию сложно использовать в неопрятном контексте/rlang.