Передача списка именованных параметров в функцию? - PullRequest
44 голосов
/ 03 февраля 2012

Я хочу написать небольшую функцию для генерации примеров из соответствующих дистрибутивов, что-то вроде:

makeSample <- function(n,dist,params)
values <- makeSample(100,"unif",list(min=0,max=10))
values <- makeSample(100,"norm",list(mean=0,sd=1))

Большая часть кода работает, но у меня возникают проблемы с выяснением, как передать именованные параметры длякаждое распределение.Например:

params <- list(min=0, max=1)
runif(n=100,min=0,max=1) # works
do.call(runif,list(n=100,min=0,max=1)) # works
do.call(runif,list(n=100,params)) # doesn't work

Я предполагаю, что мне где-то не хватает маленькой функции-обертки, но я не могу понять это.

Спасибо!

Ответы [ 2 ]

67 голосов
/ 03 февраля 2012

Почти там: попробуйте

do.call(runif,c(list(n=100),params)) 

Ваш вариант, list(n=100,params) создает список, где вторым элементом является ваш список параметров.Используйте str() для сравнения структуры list(n=100,params) и c(list(n=100),params) ...

3 голосов
/ 26 февраля 2016

c(...) имеет эффект объединения, или, на языке FP, эффект выравнивания, поэтому вы можете сократить вызов;Ваш код будет выглядеть следующим образом:

params <- list(min=0, max=1)
do.call(runif, c(n=100, params))

Попробуйте выполнить следующее сравнение:

params = list(min=0, max=1)
str(c(n=100, min=0, max=1))
str(list(n=100, min=0, max=1))
str(c(list(n=100),params))
str(c(n=100,params))

Похоже, что если в какой-то момент есть список, то результатом является список (который являетсяфункция в этом случае)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...