RStudio,脚本结果的运行和Source之间的区别

RStudio, difference between Run and Source on the result of a script

我在重命名对象的脚本部分有问题,这里有一个例子:

rm( list = ls(  ) )
# create object 'mes' in 'A.rdata'
setwd( "k:/My R space/" )
mes <- list(  a = c(1,2,3,4,5), b = c("a","b","c","d") )
save( mes, file = "A.rdata" )
rm( list = ls(  ) )
cat( "" )
# rename object 'mes' to 'essai'
setwd( "k:/My R space/" )
file = "A.rdata"
env=parent.frame()
#
tmp<-new.env()
load.names <- load( file, tmp )
Map( assign, "essai", mget( load.names, envir = tmp ), MoreArgs = list(envir = env ) )
ls.str( essai ) }

当我 运行 使用 'Source' 时,它失败了

> $essai
$essai$a
[1] 1 2 3 4 5

$essai$b
[1] "a" "b" "c" "d"

> ls.str( essai )
Error in ls.str(essai) : object 'essai' not found

当我使用 运行 时,它起作用了!

$essai
$essai$a
[1] 1 2 3 4 5

$essai$b
[1] "a" "b" "c" "d"

> ls.str( essai )
a : num [1:5] 1 2 3 4 5
b : chr [1:4] "a" "b" "c" "d"

有什么想法吗? 谢谢, 马克.

essaienv 中赋值。

但是 env 被定义为 parent.frame()

当您使用 运行 时,parent.frame() 给出 <environment: R_GlobalEnv>

source 开始,使用默认 local = FALSE,您的脚本也在 "The global environment .GlobalEnv, more often known as the user's workspace" 中执行(引用自 help(".GlobalEnv")),您可以检查是否添加 environment() 添加到您的脚本中。

但是(再次!)。尽管表达式是在 .GlobalEnv 中执行的,但它们是通过从 source() 的 R 代码调用其他(可能深度嵌套的)其他函数来计算的。这就是你用 parent.frame() 得到的,评估函数的调用环境,它本身是在 source().

调用中动态创建的执行环境

如果你在脚本中打印parent.frame(),你可以检查它,你每次都会得到不同的值,例如<environment: 0x40dca18>,然后<environment: 0x53be0f8>,然后......

好吧,够混乱了。

当你用运行做ls.str( essai )时,essai很容易在.GlobalEnv中找到,等于env!

当您使用 source() 时,essai 无法在 .GlobalEnv 或任何封闭环境中找到,因为它属于 <environment: 0x53be0f8> 或其他。

您可以使用 ls.str(get("essai", envir = env))

修复它