让我说我有一个功能名列表的tibble(或数据框,无论如何)。让我们说,像:
functions <- tibble(c("log()", "log10()", "sqrt()"))
我希望能够将数据集传递给由index选择的其中一个函数。例如,我可能想要做类似的事情:
data %>% functions[[1]]
但我似乎无法让它发挥作用。我对管道非常陌生,但我很确定这很容易,即使无法使用它!等。
提前致谢。
答案 0 :(得分:6)
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) 来电/评估一般来说eval
不赞成,但它确实形成了另一种选择:
10 %>% call(functions[2], .) %>% eval
## [1] 1
答案 1 :(得分:4)
除了已经给出的答案之外,值得注意的是,你可以在R列表甚至函数中存储几乎任何东西。所以这也有效:
funs <- list(log, log10, sqrt)
f <- funs[[1]]
2 %>% f
答案 2 :(得分:3)
你可以这样做:
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]])