从一组函数名称中选择一个函数,并将其传递给它

Moo*_*oks 5 r magrittr

假设我有一个函数名列表的tibble(或数据框,无论如何).让我们说,像:

functions <- tibble(c("log()", "log10()", "sqrt()"))
Run Code Online (Sandbox Code Playgroud)

我希望能够将数据集传递给由index选择的其中一个函数.例如,我可能想要做类似的事情:

data %>% functions[[1]]
Run Code Online (Sandbox Code Playgroud)

但我似乎无法让它发挥作用.我对管道很新,但我很确定这很容易,即使无法使用它!等等

提前致谢.

G. *_*eck 6

1)match.fun使用match.fun将一个字符串成一个函数.点.,是可选的.

functions <- c("log", "log10", "sqrt")
10 %>% match.fun(functions[2])(.)
## [1] 1
Run Code Online (Sandbox Code Playgroud)

1a)这也可以写成:

10 %>% (match.fun(functions[2]))
## [1] 1
Run Code Online (Sandbox Code Playgroud)

1b)

10 %>% (functions[2] %>% match.fun)
## [1] 1
Run Code Online (Sandbox Code Playgroud)

2)do.call do.call也可以工作:

10 %>% { do.call(functions[2], list(.)) }
## [1] 1
Run Code Online (Sandbox Code Playgroud)

3) call/eval一般eval不赞成但它确实形成另一种选择:

10 %>% call(functions[2], .) %>% eval
## [1] 1
Run Code Online (Sandbox Code Playgroud)


Moo*_*per 3

你可以这样做 :

functions <- c("log", "log10", "sqrt")
Run Code Online (Sandbox Code Playgroud)

没有理由把它们放在小标题中,如果你这样做,你就需要functions[[1]][1]像@Aaghaz-Hussain提到的那样。

seq(10) %>% get(functions[1])()
# [1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379 1.7917595 1.9459101 2.0794415 2.1972246 2.3025851
Run Code Online (Sandbox Code Playgroud)

get将从其名称中检索函数定义作为字符串,在此之后它是一个简单的管道,除非您需要确保它们()是显式的,因为seq(10) %>% get(functions[[1]])它将被解释为seq(10) %>% get(.,functions[[1]])