2017-03-17 98 views
0

我對重命名對象,這裏的例子的腳本的一部分的問題導致的運行和源極之間的區別:RStudio,在腳本

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) } 

當我與「源」運行此它失敗

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

任何想法? 謝謝, 馬克。

+0

'MoreArgs修復它=''是mapply()'語法,而不是'地圖()'語法 –

回答

0

essai分配在env

env定義爲parent.frame()

當您使用Run時,parent.frame()給出<environment: R_GlobalEnv>

source,默認local = FALSE,你的腳本在「全球環境.GlobalEnv,更多的時候被稱爲用戶的工作空間」(從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))

+0

謝謝,我已經解決了我的問題 –

+0

@MarcS。如果這回答了您的問題,您能否將其標記爲已接受? –