#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
также требуются дополнительные параметры.