我与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
是否有任何解决方案中使用的列的名称作为函数参数?
如果你想创建它接受的字符串“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)
你可以找到在此更多信息小品
我记得这是由@Richard斯克里芬回答了类似的问题。 我想你需要写这样的事情。
foo <- function(x,...)filter(x,...)
什么@Richard斯克里文提及的是,你需要使用...
在这里。 ?如果键入dplyr,你将能够找到这样的: filter(.data, ...)
我觉得你有X或任何更换。数据。 如果你想拿起它在你的DF值B中小于1行,这将是这个样子。
foo <- function (x,...) filter(x,...)
foo(df, B < 1)