Передача списка именованных параметров для работы?
Я хочу написать небольшую функцию для создания выборок из соответствующих распределений, например:
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
Я предполагаю, что я где-то пропускаю небольшую функцию-оболочку, но не могу понять это.
Спасибо!
Ответы
Ответ 1
Практически там: попробуйте
do.call(runif,c(list(n=100),params))
Ваш вариант, list(n=100,params)
создает список, в котором вторым элементом является ваш список параметров. Используйте str()
для сравнения структуры list(n=100,params)
и c(list(n=100),params)
...
Ответ 2
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))
Похоже, если список присутствует в любой точке, результатом будет список (который является желательной функцией в этом случае использования)