从magrittr管道切换至R原生管道时出错的原因咨询
问题:magrittr管道与R原生管道的行为差异
先定义以下变量:
explanatory_vars <- c("age", "bmi") outcome <- "Surv(time = mytime, event = myevent)"
使用magrittr的%>%管道,以下代码可以正常运行:
explanatory_vars %>% str_c(paste(outcome, " ~ ", sep=""), .)
但改用R原生的|>管道时,代码会抛出错误:
explanatory_vars |> str_c(paste(outcome, " ~ ", sep=""), .)
错误信息:
Error in str_c(explanatory_vars, paste(outcome, " ~ ", sep = ""), .) :
object '.' not found
原本以为%>%和|>可以直接互换,为什么会出现这个差异?
核心原因:两者对.的处理逻辑不同
magrittr的
%>%管道:
它会将左侧输入默认作为右侧函数的第一个参数,同时允许用.在函数参数的任意位置指代左侧输入。你写的代码里,.明确代表explanatory_vars,所以str_c的实际参数是paste(outcome, " ~ ", sep="")+explanatory_vars,符合函数要求,因此能正常运行。R原生
|>管道:
它的设计更简洁,只负责将左侧输入传递给右侧函数的第一个未命名参数,不支持用.在任意位置引用左侧输入。当你在str_c里写.时,R会把它当作一个普通的全局变量去查找,而你并没有定义过这个变量,所以会抛出"object '.' not found"的错误。
原生管道的正确写法
如果要实现和magrittr管道同样的效果,原生管道需要用匿名函数显式指定参数位置:
explanatory_vars |> {\(x) str_c(paste(outcome, " ~ ", sep=""), x)}()
或者如果调整参数顺序,让左侧输入成为str_c的第一个参数,也可以直接用原生管道,但这里因为我们需要把paste的结果放在第一个位置,所以匿名函数是更直接的解决方案。
内容的提问来源于stack exchange,提问作者ECII
相关产品推荐
相关产品推荐

