R函数中多次调用replace仅最后一次生效,如何按值修改向量?
解决R函数中多次
replace()仅最后一次生效的问题 嗨,这个问题我之前也踩过坑!你现在的问题核心在于:每次调用replace()时,都是直接基于**原始输入向量x**进行操作的,而不是用上一次修改后的结果。第一个replace(x,x==1,2)的修改结果根本没被保存或传递,程序直接执行了第二个replace,所以最终只看到最后一次的修改效果。
下面给你几种可行的解决方案,按你的需求选择:
方法1:链式传递修改结果
把第一次replace的输出作为第二次replace的输入,这样就能基于修改后的向量继续操作:
test <- function(x) { # 第一次replace的结果传给第二次replace replace(replace(x, x == 1, 2), x == 3, 4) }
如果习惯用管道语法(需要加载magrittr包),代码会更易读:
library(magrittr) test <- function(x) { x %>% replace(. == 1, 2) %>% # 第一次修改,.代表上一步的结果 replace(. == 3, 4) # 基于修改后的结果再操作 }
方法2:分步保存修改后的向量
每次修改后把结果重新赋值给x,逐步更新:
test <- function(x) { x <- replace(x, x == 1, 2) # 第一次修改后更新x x <- replace(x, x == 3, 4) # 基于更新后的x再修改 x # 返回最终结果 }
方法3:更简洁的向量运算(针对你的具体需求)
你的需求是给所有奇数加1,其实不用多次replace,直接用向量逻辑运算就能一步完成,效率更高:
test <- function(x) { # x %% 2 == 1 会生成奇数位置为TRUE(即1)、偶数为FALSE(即0)的向量 x + (x %% 2 == 1) }
现在调用test(c(1:3)),就能得到你预期的[1] 2 2 4啦!
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

