如何使用R基础管道创建表达式/调用?
用R基础管道
|>替代magrittr管道%>%实现表达式替换的问题 原magrittr管道实现示例
使用magrittr的%>%管道时,可通过substitute轻松替换生成目标管道表达式:
ex1 <- quote(iris) ex2 <- quote(dplyr::filter(Species == "setosa" & Sepal.Width > 4)) substitute(x %>% y, list(x = ex1, y = ex2)) #> iris %>% filter(Species == "setosa" & Sepal.Width > 4)
替换为基础管道|>时的报错问题
尝试直接用substitute替换为R基础管道|>时,会触发语法错误:
substitute(x |> y, list(x = ex1, y = ex2)) #> Error: The pipe operator requires a function call as RHS
原因及解决方法
报错核心原因是:R基础管道|>有严格语法要求,右侧必须是函数调用表达式,而substitute解析x |> y时会先验证语法——此时y只是一个符号,不符合函数调用要求,因此直接报错。而magrittr的%>%是普通二元运算符,无此语法校验步骤。
要实现等价效果,直接用call()函数构造基础管道表达式即可,它不会提前做语法校验:
ex1 <- quote(iris) ex2 <- quote(dplyr::filter(Species == "setosa" & Sepal.Width > 4)) # 构造基础管道表达式 call("|>", ex1, ex2) #> iris |> dplyr::filter(Species == "setosa" & Sepal.Width > 4)
若一定要用substitute,需确保右侧替换后是合法函数调用,写法如下(会多一层括号,执行结果一致但可读性稍差):
substitute(x |> (y), list(x = ex1, y = ex2)) #> iris |> (dplyr::filter(Species == "setosa" & Sepal.Width > 4))
内容的提问来源于stack exchange,提问作者nbenn
相关产品推荐
相关产品推荐

