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

时间:2017-03-17 13:23:13

标签: r rstudio

我在重命名对象的脚本的一部分上遇到问题,这里是一个示例:

pod install

当我使用' Source'它失败了

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( "\14" )
# 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 ) }

当我使用Run时,它可以工作!

> $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

有什么想法吗? 谢谢, 标记

1 个答案:

答案 0 :(得分:0)

essai已在env中分配。

env定义为parent.frame()

使用“运行”时,parent.frame()会提供<environment: R_GlobalEnv>

来自source,使用默认local = FALSE,您的脚本也会在&#34;全球环境.GlobalEnv中执行,通常称为用户工作区&# 34; (引自help(".GlobalEnv")),您可以检查是否在脚本中添加environment()

但是(再次!)。即使表达式在.GlobalEnv中执行,它们也会通过调用source()的R代码中的其他(可能是深度嵌套的)其他函数来计算。这就是parent.frame(),即评估函数的调用环境,它本身就是在source()调用内动态创建的执行环境。

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

嗯,足够混乱。

使用“运行”ls.str( essai )时,essai中很容易找到.GlobalEnvenv等于source()

当您使用essai时,.GlobalEnv或任何封闭环境中找不到<environment: 0x53be0f8>,因为它属于ls.str(get("essai", envir = env))或其他任何内容。

您可以使用import urllib.request url = "http://www.londonstockexchange.com/exchange/prices-and-markets/stocks/indices/ftse-indices.html" infile = urllib.request.urlopen(url) # Open the URL data = infile.read().decode('ISO-8859-1') # Read the content as string decoded with ISO-8859-1 print(data) # Print the data to the screen

进行修复