关于R语言purrr::accumulate与paste函数的输出差异疑问
purrr::accumulate匿名函数参数问题解答
核心问题原因
你第二个示例的问题完全是公式风格匿名函数的参数误用导致的。在purrr的公式语法(~开头的匿名函数)里,.x代表accumulate每次迭代的累积中间结果,而.y才是当前遍历到的.x向量(也就是letters[1:5])里的元素。你写的~paste(.x)只用到了累积值,完全没把当前的字母传进去,所以每次迭代都只是返回之前的累积值,自然全是"Z"。
拆解两个示例的运行逻辑
第一个示例(正确拼接)
当你直接传paste作为.f时,accumulate会自动把两个参数传给它:
- 第一次迭代:用
.init的值"Z"和letters[1](也就是"a")调用paste("Z", "a"),得到"Z a" - 第二次迭代:用上一次的结果
"Z a"和letters[2]("b")调用paste("Z a", "b"),得到"Z a b" - 以此类推,直到遍历完所有5个字母,最终得到累积拼接的序列。
第二个示例(错误逻辑)
你写的~paste(.x)只接收了累积值.x,完全丢弃了当前元素.y:
- 第一次迭代:传入累积值
"Z"和当前元素"a",但函数只处理.x,返回"Z" - 第二次迭代:传入上一次的结果
"Z"和当前元素"b",还是只返回"Z" - 后面所有迭代都重复这个逻辑,所以输出全是
"Z"。
修正方案
如果你想得到和第一个示例完全一致的结果,只需要在匿名函数里同时用到.x和.y:
accumulate( .x = letters[1:5], .f = ~paste(.x, .y), .init = "Z" )
如果你的预期是生成"Z"、"ZZ"、"ZZZ"这种无空格的重复序列,就用paste0(无分隔符拼接),并且把当前元素换成"Z":
# 生成Z、ZZ、ZZZ...的序列 accumulate( .x = letters[1:5], .f = ~paste0(.x, "Z"), .init = "Z" )
内容的提问来源于stack exchange,提问作者alejandro_hagan
相关产品推荐
相关产品推荐

