R管道命令中打印/日志输出顺序反转问题求助
R管道中print输出顺序反转的原因解析
先看测试代码:
test_pipe = function(dta, txt) { print(txt) return(paste(dta,txt)) } strg = '0' strg = strg %>% test_pipe(1) %>% test_pipe(2) %>% test_pipe(3) print(strg)
运行后输出为:
[1] 3 [1] 2 [1] 1 [1] "0 1 2 3"
核心原因:magrittr管道的参数求值顺序
这是因为%>%(magrittr管道)的参数求值逻辑是从右到左,而非直观的从左到右执行函数。
具体拆解执行过程:
- 参数优先求值:R会先处理所有
test_pipe调用的第二个参数txt——从最右侧的3开始,依次向左求值2、1,所以这三个值会被先print出来,顺序就是3→2→1。 - 函数主体从左到右执行:完成所有参数求值后,R才会从左到右执行函数的核心逻辑:
- 初始值
'0'传入test_pipe(1),拼接得到"0 1"; - 把
"0 1"传入test_pipe(2),拼接得到"0 1 2"; - 再把
"0 1 2"传入test_pipe(3),最终拼接出"0 1 2 3";
- 初始值
- 最后打印最终的
strg变量。
关于flog.info()时间戳一致的说明
用flog.info()替换print()后时间戳相同,是因为参数求值和函数执行的整个过程耗时极短(毫秒级以内),日志系统无法捕捉到这么细微的时间差,所以所有日志的时间戳显示一致。
内容的提问来源于stack exchange,提问作者EuginePickett
相关产品推荐
相关产品推荐

