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"
有什么想法吗?
谢谢,
马克.
essai
在 env
中赋值。
但是 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))
修复它
我在重命名对象的脚本部分有问题,这里有一个例子:
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"
有什么想法吗? 谢谢, 马克.
essai
在 env
中赋值。
但是 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))