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

Как вызвать функцию с помощью символьной строки имени функции в R?

Я пытаюсь вызвать функцию с заданной строкой имени функции.

например.

print(funcList)
[[1]]
`*`

[[2]]
sin

работы:

mult <- `*`
mult(5,6)
[1] 30

не работает:

func1 <- funcList[[1]]
func1(5,6)

func2 <- funcList[[2]]
func2(1.2)

Итак, можно ли вызвать все функции в списке функций?

4b9b3361

Ответ 1

Те не похожи на строки; который выглядит как список функций. Чтобы ответить на вопрос, заданный в вашем названии, см. get(). Например, используя ваш список, но сохраняемый как символьные строки:

funcList <- list("*", "sin")

мы можем использовать get() для возврата функции с именем, заданным выбранным элементом списка:

> f <- get(funcList[[1]])
> f
function (e1, e2)  .Primitive("*")
> f(3,4)
[1] 12

Альтернативой является функция match.fun(), которая задает строку, найдет функцию с именем, соответствующим этой строке:

> f2 <- match.fun(funcList[[1]])
> f2(3,4)
[1] 12

но, как говорит ?match.fun, мы, вероятно, не должны делать этого в подсказке, но изнутри функции.

Если у вас есть список функций, то можно просто индексировать его в списке и использовать его как функцию:

> funcList2 <- list(`*`, sin)
> str(funcList2)
List of 2
 $ :function (e1, e2)  
 $ :function (x)  
> funcList2[[1]](3, 4)
[1] 12
> funcList2[[2]](1.2)
[1] 0.9320391

или вы можете сохранить функции как промежуточные объекты, но это мало смысла:

> f3 <- funcList2[[1]]
> f3(3,4)
[1] 12
> f4 <- funcList2[[2]]
> f4(1.2)
[1] 0.9320391

Ответ 2

См. документацию для do.call.

Быстрая демонстрация:

do.call("rnorm", list(100, 0, 1))

первым параметром может быть строковый литерал или объект R, а второй - список аргументов, которые должны быть сопоставлены с предоставленными формальными аргументами функции.

Ответ 3

вы также можете использовать match.fun

> functionlist <- list("*","sin")
> f <- match.fun(functionlist[[1]])
> f(5,6)
[1] 30