字符串作为函数参数[R(character string as function argument

2019-10-21 01:21发布

我与dplyr和创建的代码工作以计算绘制与ggplot新的数据。

我想创建一个与此代码的功能。 应该采取由dplyr操纵的数据帧的一列的名称。 但是,试图与COLUMNNAMES不起作用工作。 请考虑下面的小例子:

df <- data.frame(A = seq(-5, 5, 1), B = seq(0,10,1))

library(dplyr)
foo <- function (x) {
         df %>%
            filter(x < 1)
}

foo(B)

Error in filter_impl(.data, dots(...), environment()) : 
  object 'B' not found 

是否有任何解决方案中使用的列的名称作为函数参数?

Answer 1:

如果你想创建它接受的字符串“B”作为自变量的函数(如你的问题的标题)

foo_string <- function (x) {
         eval(substitute(df %>% filter(xx < 1),list(xx=as.name(x))))
}
foo_string("B")

如果你想创建它接受捕捉B中的参数(如dplyr)函数

foo_nse <- function (x) {
         # capture the argument without evaluating it
         x <- substitute(x)
         eval(substitute(df %>% filter(xx < 1),list(xx=x)))
}
foo_nse(B)

你可以找到更多信息预研

编辑

dplyr使事情在0.3版本更容易。 带有后缀的功能“_”接受一个字符串或表达式作为参数

 foo_string <- function (x) {
             # construct the string
             string <- paste(x,"< 1")
             # use filter_ instead of filter
             df %>% filter_(string)
    }
foo_string("B")
 foo_nse <- function (x) {
             # capture the argument without evaluating it
             x <- substitute(x)
             # construct the expression
             expression <- lazyeval::interp(quote(xx < 1), xx = x)
             # use filter_ instead of filter
             df %>% filter_(expression)
    }
foo_nse(B)

你可以找到在此更多信息小品



Answer 2:

我记得这是由@Richard斯克里芬回答了类似的问题。 我想你需要写这样的事情。

foo <- function(x,...)filter(x,...) 

什么@Richard斯克里文提及的是,你需要使用...在这里。 ?如果键入dplyr,你将能够找到这样的: filter(.data, ...)我觉得你有X或任何更换。数据。 如果你想拿起它在你的DF值B中小于1行,这将是这个样子。

foo <- function (x,...) filter(x,...)
foo(df, B < 1)


文章来源: character string as function argument r