имена функций как переменные цикла в R

#r

Вопрос:

Я пытаюсь автоматизировать повторяющиеся задачи. У меня есть много функций с именами as fun1 fun2 и так далее. Я хочу запустить их в цикле. Т. е. иметь что-то вроде for (i in 1:N) as.function( paste0("fun",i) . Как это сделать?

Репродекс:

 xx = -5:5; 
plot(xx, dnorm(xx), main = "PDF: norm") 
plot(xx, dpois(xx), main = "PDF: pois") 
plot(xx, dbinom(xx), main = "PDF: binom") 
# 

for (i in c("norm", "pois", "binom")) {
  fun <- as.function(paste0("d",i))
  plot(xx, fun(xx), main = paste0("PDF: ", i))  
}
 

Комментарии:

1. Вы можете передавать функции непосредственно в цикле, т. Е. for (i in c(mean, sd, var)) { print(i(1:10)) } (я не понимаю fun(xx) часть в вашем примере кода, поэтому я привел свой собственный пример 😉

Ответ №1:

Используется getFunction для получения объекта функции из его строкового имени.

 > getFunction("dnorm")
#function (x, mean = 0, sd = 1, log = FALSE) 
#.Call(C_dnorm, x, mean, sd, log)
#<bytecode: 0x7fa2e8bc1730>
#<environment: namespace:stats>
 

Это означает, что вы можете писать

 for (i in c("norm", "pois", "binom")) {
  fun <- getFunction(paste0("d",i))
  plot(xx, fun(xx), main = paste0("PDF: ", i))  
}
 

Примечание: dpois требуется lambda параметр, поэтому этот код вызывает ошибку. dbinom также требуются дополнительные параметры.