rlang::duplicate与data.table::copy在函数外可用但函数内失效问题
问题根源
在R中,函数内部创建的变量默认属于局部环境——函数执行完毕后,这个局部环境会被销毁,里面的变量也会随之消失。你在函数外执行func <- duplicate(func1)时,是直接在全局环境中创建了func变量,所以能保留下来;但cond.rename函数内赋值的func只存在于函数的局部环境,函数结束后就被清理了,外部自然看不到。
两种解决方案
方案一:全局赋值(快速解决,但不推荐频繁用)
用<<-代替<-,强制将func赋值到全局环境:
library(rlang) func1 <- function(x) x + 1 func2 <- function(x) x * 2 cond.rename <- function(horg) { if (horg == "1") { func <<- duplicate(func1) # 全局环境赋值 } else if (horg == "2") { func <<- duplicate(func2) } } cond.rename("1") func(5) # 输出6,func已在全局环境创建
注意:全局赋值会直接修改全局环境,容易引发变量冲突,非必要不推荐。
方案二:函数返回目标函数(推荐,符合R编程规范)
让cond.rename返回复制后的函数,在外部接收赋值:
library(rlang) func1 <- function(x) x + 1 func2 <- function(x) x * 2 cond.rename <- function(horg) { if (horg == "1") { duplicate(func1) } else if (horg == "2") { duplicate(func2) } } # 外部接收返回的函数 func <- cond.rename("1") func(5) # 输出6
这种方式不会污染全局环境,逻辑更清晰,也更容易调试。
补充说明
data.table::copy主要用于复制data.table对象,对于函数这类对象,rlang::duplicate足够满足深拷贝需求;如果不需要完全独立的副本,直接用func <- func1做引用赋值也可以。
内容的提问来源于stack exchange,提问作者pakalla
相关产品推荐
相关产品推荐

