这里有两种不同的方式,其中一个工作和一种不分配一个例子:分配给一个data.frame用`with`
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)
注意的是一个相当简单的^ H^H^H^H^H^^ h短功能:
function (data, expr, ...)
eval(substitute(expr), data, enclos = parent.frame())
首先,让我们用复制的功能:
eval(substitute(Time+weight), envir=dat, enclos=parent.frame())
现在用不同的机箱测试:
testEnv <- new.env()
eval(substitute(test3 <- Time+weight), envir=dat, enclos=testEnv)
ls(envir=testEnv)
哪个仍然没有分配到任何地方。这反驳了我的预感,认为它与封闭的环境被抛弃有关,而是指向一些更基本的论点,而不是做我认为它的做法。
我很好奇力学为什么这是怎么回事,如果有一个替代允许转让。
因为'dat'不是环境你的最后一个例子不修改'dat'。最好它会通过'as.environment'强制转换到一个环境,然后被修改,然后立即丢弃,因为没有其他引用,所以原来的'dat'保持不变。 – 2013-02-12 03:54:51