magrittr管道%>%隐式行为解析:两函数输出为何不同?
为什么两个函数的
substitute()输出不同? 核心原因:substitute()的工作逻辑 + 管道%>%的调用环境变化
先看my_function的运行逻辑
当调用my_function("zaza")时:
substitute(x)会在my_function的调用环境中工作——它的作用是把函数形参x替换成你调用函数时传入的原始表达式,也就是"zaza"。- 随后
deparse()把这个表达式转换为字符串,所以输出带引号的"\"zaza\""(这是deparse()对字符串字面量的默认处理方式)。
再看my_other_function的管道逻辑
%>%管道的本质是把左侧对象作为第一个参数传给右侧函数,同时会创建一个临时调用环境。当你写x %>% substitute()时:
- 这等价于在管道的临时环境中调用
substitute(x),此时substitute()看到的x已经是my_other_function内部的形参变量名,而不是你调用my_other_function("zaza")时传入的原始表达式"zaza"。 - 所以
substitute(x)返回的是符号x本身,经过deparse()转换后就得到字符串"x"。
验证:去掉管道后的对比
如果在my_other_function里直接调用substitute(x)而不用管道,结果会和my_function完全一致:
my_other_function_fixed <- function(x) { the_name_of_x <- deparse(substitute(x)) print(the_name_of_x) } my_other_function_fixed("zaza") # [1] "\"zaza\""
内容的提问来源于stack exchange,提问作者Greg Mansio
相关产品推荐
相关产品推荐

