这是一个以两种不同方式分配的示例,一种有效,一种无效:
library(datasets)
dat <- as.data.frame(ChickWeight)
dat$test1 <- with(dat, Time + weight)
with(dat, test2 <- Time + weight)
> colnames(dat)
[1] "weight" "Time" "Chick" "Diet" "test1"
我已经习惯了这种行为。也许更令人惊讶的是test2
它就消失了(而不是像我预期的那样在基础环境中结束):
> ls(pattern="test")
character(0)
注意 with 是一个相当简单的^H^H^H^H^H^H 短函数:
function (data, expr, ...)
eval(substitute(expr), data, enclos = parent.frame())
首先让我们复制 with 的功能:
eval( substitute(Time+weight), envir=dat, enclos=parent.frame() )
现在用不同的外壳进行测试:
testEnv <- new.env()
eval( substitute(test3 <- Time+weight), envir=dat, enclos=testEnv )
ls( envir=testEnv )
仍然没有分配任何地方。这反驳了我的预感,即它与被丢弃的封闭环境有关,而是指出了一些更基本的,enclos
论点,而不是像我认为的那样做。
我很好奇为什么会这样的机制以及是否有允许分配的替代方案。