R基础管道|>无法通过反引号引用?报错找不到函数`|>`
R基础管道
|>的特殊行为与自定义管道实现问题 我正在尝试为R的基础管道运算符|>构建包装器,需要先修改左侧内容再传递给后续操作,但开发中发现它和其他运算符存在明显差异:
正常工作的运算符示例
`+`(1,2) #> [1] 3 `<-`("foo", 1) foo #> [1] 1 library(magrittr) `%>%`(1, print) #> [1] 1
基础管道的异常表现
`|>`(1, print) #> Error in `|>`(1, print): could not find function "|>"
这种差异直接影响了通过eval()+as.call构建管道调用的场景:
magrittr管道可正常执行
as.call(c(as.name("%>%"), "foo", substitute(print))) #> "foo" %>% print eval(as.call(c(as.name("%>%"), "foo", substitute(print)))) #> [1] "foo"
基础管道执行报错
eval(as.call(c(as.name("|>"), "foo", substitute(print)))) #> Error in `|>`("foo", print): could not find function "|>"
我没法精准描述这个问题,加上特殊字符查询困难,找不到相关官方文档说明。
自定义管道的需求与实现
我想要做一个能传递对象名称的管道变体,基于magrittr的实现如下:
library(magrittr) `%>>%` <- function(lhs, rhs) { lhs.name <- deparse(substitute(lhs)) parent <- parent.frame() env <- new.env(parent = parent) eval( as.call(c(as.name("%>%"), lhs.name, substitute(rhs))), env, env ) } foo_func <- function(arg1, arg2, arg3) { print(arg1) print(arg2) print(arg3) arg2 + arg3 } thing %>>% foo_func(2,4) #> [1] "thing" #> [1] 2 #> [1] 4 #> [1] 6
为了避免依赖magrittr,我尝试用基础管道|>替代,目前临时用以下代码实现,还未做全面测试:
eval( str2lang(paste0("'", lhs.name, "'", " |>", deparse(substitute(rhs)))), env, env )
内容的提问来源于stack exchange,提问作者lost
相关产品推荐
相关产品推荐

