使用%>%管道符调用assign()函数时为何无法完成赋值?
为什么用
%>%管道调用assign()无法完成赋值? 你的问题核心在于管道执行时的环境差异,具体原因和解决办法如下:
问题根源
直接调用assign()时,函数默认在当前环境(比如全局环境)中创建/修改变量;但%>%管道在执行右侧函数时,会生成一个临时子环境作为执行上下文。
你的代码里:
g <- "var" # 直接调用assign:在全局环境赋值,var_name=1 assign(paste0(g, "_name"), 1) # 管道调用assign:在临时子环境中赋值,全局环境的var_name不受影响 paste0(g, "_name") %>% assign(2)
因为assign()默认将值写入当前执行环境(管道的临时子环境),这个环境在管道执行结束后就会被销毁,所以全局环境的var_name始终是1。
解决办法
给assign()明确指定目标环境即可,比如要赋值到全局环境,就用.GlobalEnv:
paste0(g, "_name") %>% assign(2, envir = .GlobalEnv)
如果是在函数内部使用,需要赋值到函数的上层环境,可以用parent.frame()替代.GlobalEnv,根据实际场景调整。
内容的提问来源于stack exchange,提问作者kesey
相关产品推荐
相关产品推荐

