Как вызвать функцию, используя строку символов имени функции в R? - PullRequest
36 голосов
/ 19 июня 2011

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

например.

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

[[2]]
sin

работает:

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

не работает:

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

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

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

Ответы [ 3 ]

39 голосов
/ 19 июня 2011

Они не похожи на строки; это выглядит как список функций. Чтобы ответить на вопрос, заданный в вашем заголовке, см. 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
27 голосов
/ 19 июня 2011

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

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

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

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

2 голосов
/ 28 октября 2017

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

> functionlist <- list("*","sin")
> f <- match.fun(functionlist[[1]])
> f(5,6)
[1] 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...