magrittr暴露运算符%$%与with函数行为差异的疑问求助
理解magrittr的%$%运算符优先级问题
这个问题的核心是运算符优先级,我来一步步帮你拆解清楚:
首先,with()函数的工作逻辑很直接——它会把第二个参数的整个表达式,都放到传入的数据框环境中求值。所以sum(Sepal.Length)和sum(Sepal.Width)都能在iris的上下文里找到对应的列,自然能正常计算。
但%$%运算符的优先级比除法/要低!这就导致你写的代码:
iris %$% sum(Sepal.Length) / sum(Sepal.Width)
被R解析成了:
(iris %$% sum(Sepal.Length)) / sum(Sepal.Width)
也就是说,只有sum(Sepal.Length)是在iris的环境中执行的,而后面的sum(Sepal.Width)是在全局环境里找这个对象,自然就会报错“找不到'Sepal.Width'”。
解决方法
你只需要把要在iris环境中执行的整个表达式,用括号或者大括号包裹起来,让%$%把整个表达式都纳入数据框的上下文:
方法1:用括号包裹
iris %$% (sum(Sepal.Length)/sum(Sepal.Width)) # 输出:[1] 1.911252
方法2:用大括号包裹(更贴合magrittr的管道风格)
iris %$% { sum(Sepal.Length)/sum(Sepal.Width) } # 输出:[1] 1.911252
这样修改后,两个sum()函数都能在iris的环境中找到对应的列,结果就和with()完全一致了。
内容的提问来源于stack exchange,提问作者Marco De Virgilis
相关产品推荐
相关产品推荐

