Подтвердить что ты не робот

Передача списка именованных параметров для работы?

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

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

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

Спасибо!

4b9b3361

Ответ 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))

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