R 是否有方法将带有逻辑运算符(!=、>;、<;)的参数传递给函数?
tolower(arg)中的错误:未找到对象“biomarker”当然有一种方法:运算符是R中的正则函数,您可以像任何其他函数一样传递它们 唯一复杂的是,运算符是非语法名称,因此不能“按原样”传递它们,这会混淆解析器。相反,您需要用反勾号将它们包装起来,以便在需要名称的地方使它们的使用在语法上有效:R 是否有方法将带有逻辑运算符(!=、>;、<;)的参数传递给函数?,r,function,dplyr,R,Function,Dplyr,tolower(arg)中的错误:未找到对象“biomarker”当然有一种方法:运算符是R中的正则函数,您可以像任何其他函数一样传递它们 唯一复杂的是,运算符是非语法名称,因此不能“按原样”传递它们,这会混淆解析器。相反,您需要用反勾号将它们包装起来,以便在需要名称的地方使它们的使用在语法上有效: create_c(df = bsl_all_nsclc, line_number > 2) create_c(df, biomarker != "positive)
create_c(df = bsl_all_nsclc,
line_number > 2)
create_c(df, biomarker != "positive)
filter\u something=函数(值,op){
op(数值,13)
}
过滤某物(汽车$speed,`>`)
过滤某物(汽车$speed,`%
过滤器({expr}})
}
过滤某物2(汽车,速度<13)
这里的“秘密酱汁”是{…}
语法。这是因为来自'dplyr'的过滤器
接受未计算的参数,并通过将其转换为(有效的)!!enexpr(expr)
来处理{expr}
。也就是说:expr
首先是“解除的”:它被显式标记为未计算,名称expr
被它绑定到的未计算表达式所替换(speed<13
)。接下来,这个未计算表达式是不带引号的。也就是说,包装是“剥离的”在filter
中处理未赋值表达式本身,就像它作为filter(.data,speed<13)
传递一样。换句话说,在调用表达式中,名称expr
被speed<13
替换
有关更详细的解释,请参阅小插图。当然有一种方法:运算符是R中的常规函数,您可以像其他函数一样传递它们 唯一复杂的是,运算符是非语法名称,因此您不能按“原样”传递它们,这会使解析器感到困惑。相反,您需要将它们包装在反勾中,以便在需要名称的地方使它们的使用在语法上有效:
create_c(df = bsl_all_nsclc,
line_number > 2)
create_c(df, biomarker != "positive)
filter\u something=函数(值,op){
op(数值,13)
}
过滤某物(汽车$speed,`>`)
过滤某物(汽车$speed,`%
过滤器({expr}})
}
过滤某物2(汽车,速度<13)
这里的“秘密酱汁”是{…}
语法。这是因为来自'dplyr'的过滤器
接受未计算的参数,并通过将其转换为(有效的)!!enexpr(expr)
来处理{expr}
。也就是说:expr
首先是“解除的”:它被显式标记为未计算,名称expr
被它绑定到的未计算表达式所替换(speed<13
)。接下来,这个未计算表达式是不带引号的。也就是说,包装是“剥离的”在filter
中处理未赋值表达式本身,就像它作为filter(.data,speed<13)
传递一样。换句话说,在调用表达式中,名称expr
被speed<13
替换
要获得更全面的解释,请参考小插图。也许您可以切换到以字符串形式提供筛选参数,如
“biomarker!=“positive”
,然后使用eval(parse(text=…))
@Jonas通过字符串执行此操作在R中是不必要的,实际上是一种反模式。也许您可以切换到以字符串形式提供筛选器参数,如“biomarker!=“positive”
,然后使用eval(parse(text=…)
@Jonas通过字符串执行此操作在R中是不必要的,实际上是一种反模式。
filter_something = function (value, op) {
op(value, 13)
}
filter_something(cars$speed, `>`)
filter_something(cars$speed, `<`)
filter_something(cars$speed, `==`)
filter_something2 = function (.data, expr) {
.data %>%
filter({{expr}})
}
filter_something2(cars, speed < 13)