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

时间:2018-03-23 16:20:05

标签: r magrittr

让我说我有一个功能名列表的tibble(或数据框,无论如何)。让我们说,像:

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

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

data %>% functions[[1]]

但我似乎无法让它发挥作用。我对管道非常陌生,但我很确定这很容易,即使无法使用它!等。

提前致谢。

3 个答案:

答案 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]])