从一堆函数名中选择一个函数,并通过管道传递给它

Choose a function from a tibble of function names, and pipe to it

假设我有一个包含函数名称列表的小标题(或数据框,等等)。比方说,类似于:

functions <- tibble(c("log()", "log10()", "sqrt()"))

我希望能够将数据集通过管道传输到这些函数之一,由索引选择。例如,我可能想做类似的事情:

data %>% functions[[1]]

但我似乎无法让它工作。我对管道很陌生,但我很确定这很容易,即使不能让它一起工作!等等

提前致谢。

你可以这样做:

functions <- c("log", "log10", "sqrt")

没有理由将它们放在小标题中,如果你这样做,你将需要 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

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

1) match.fun 使用match.fun 将字符串转换为函数。点 . 是可选的。

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

1a) 这也可以写成:

10 %>% (match.fun(functions[2]))
## [1] 1

1b)

10 %>% (functions[2] %>% match.fun)
## [1] 1

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

10 %>% { do.call(functions[2], list(.)) }
## [1] 1

3) call/eval 通常 eval 是不受欢迎的,但它确实形成了另一种选择:

10 %>% call(functions[2], .) %>% eval
## [1] 1

除了已经给出的答案之外,值得注意的是,您几乎可以在 R 列表中存储任何内容,甚至是函数。所以这也有效:

funs <- list(log, log10, sqrt)
f <- funs[[1]]
2 %>% f