2017-04-13 521 views
1

我在R中有一些我打算分析的數據。但是,該文件不顯示數據。相反,它只是在數據中顯示一個變量。以下是我用來加載數據和生成輸出的過程。如何在R窗口中打開R數據文件

load("C:\Users\user\AppData\Local\Temp\1_29_923-Macdonell.RData") 

data=load("C:\Users\user\AppData\Local\Temp\1_29_923-Macdonell.RData") 

data 

[1] 「HeightFinger」

我要如何查看數據?

+0

將您的反斜槓更改爲正斜槓(\ to /)或將\ \替換爲\\ –

+0

或將其更改爲雙反斜槓......嘗試上述代碼時發生了什麼? – r2evans

回答

2

如果你read ?help,它說的load返回值是:

創建的對象的名字的特徵向量,無形。

這表明(但不可否認並不狀態)的load命令的真正工作是side-effect,因爲它插入對象到環境中(默認爲當前的環境,常常但並不總是.GlobalEnv)。您應該立即從您稱爲load(...)的地方訪問它們。

舉例來說,如果我能在變量猜你可能在你的rda文件:

x 
# Error: object 'x' not found 

# either one of these on windows, NOT BOTH 
dat = load("C:\\Users\\user\\AppData\\Local\\Temp\\1_29_923-Macdonell.RData") 
dat = load("C:/Users/user/AppData/Local/Temp/1_29_923-Macdonell.RData") 

dat 
# [1] "x" "y" "z" 
x 
# [1] 42 

如果你想他們是未存儲在當前的環境下,你可以建立一個環境把它們放進去。(我用parent=emptyenv(),但這並不是嚴格要求的。有一些小的分歧,不包括這個選項,沒有一個是驚天動地的。)

myenv <- new.env(parent = emptyenv()) 
dat = load("C:/Users/user/AppData/Local/Temp/1_29_923-Macdonell.RData", 
      envir = myenv) 
dat 
# [1] "x" "y" "z" 
x 
# Error: object 'x' not found 
ls(envir = myenv) 
# [1] "x" "y" "z" 

從這裏,你可以在任何數量的方式在您的數據得到:

ls.str(myenv) # similar in concept to str() but for environments 
# x : num 42 
# y : num 1 
# z : num 2 
myenv$x 
# [1] 42 
get("x", envir = myenv) 
# [1] 42 

旁註:

您可能已經注意到,我用dat作爲我的變量名而不是data。雖然您當然可以使用它,但如果您使用與現有變量或函數匹配的變量名稱,它會咬你。例如,只要您加載數據,所有代碼都可以正常工作。但是,如果你運行一些代碼沒有預加載你的對象放入data變量,你可能會得到一個錯誤,如:

mean(data$x) 
# Error in data$x : object of type 'closure' is not subsettable 

該錯誤信息不會立即不言而喻。問題是如果之前沒有定義在你的問題中,那麼data這裏指的是函數data。在規劃方面,一個closure is a special type of function,所以錯誤確實應該這樣說:

# Error in data$x : object of type 'function' is not subsettable 

這意味着雖然dat可以子集和dat$x意味着什麼,你不能使用$子方法上的功能本身。 (例如,在提及mean函數時,不能這樣做mean$x)。無論如何,儘管這裏修改後的錯誤消息不那麼令人困惑,但它仍然不能清楚地告訴您問題所在的位置。因此,許多經驗豐富的程序員會建議您使用唯一的變量名稱(可能不只是x :-))。如果您使用我的建議,並將其命名爲dat代替,那麼不預加載數據的錯誤,而不是將誤差:

mean(dat$x) 
# Error in mean(dat$x) : object 'dat' not found 

這是很多更有意義,更容易解決。

1

有兩種方法可以保存R對象,並且混淆了它們。在第一種方法中,您將中的任何對象集合在環境中的一個文件中。當你的文件爲load()時,這些對象在當前環境中被重新創建,其名稱爲,其名稱爲。這是R如何保存和重新提供工作空間。

第二種方法是將單個R對象存儲(序列化)到具有saveRDS()函數的文件中,並使用readRDS()函數在您的環境中重新創建它。如果你不要分配readRDS()的結果,它只會打印到你的屏幕上,並漂移。

例子如下:

# Make a simple dataframe 
testdf <- data.frame(x = 1:10, 
        y = rnorm(10)) 

# Save it out using the save() function 
savedir <- tempdir() 
savepath <- file.path(savedir, "saved.Rdata") 
save(testdf, file = savepath) 

# Delete it 
rm(testdf) 

# Load without assigning - and it's back in your environment 
load(savepath) 
testdf 

# But if you assign the results of load, you just get the name of the object 
wrong <- load(savepath) 
wrong 


# Compare with the RDS: 
rds_path <- file.path(savedir, "testdf.rds") 
saveRDS(testdf, file = rds_path) 
rm(testdf) 
testdf <- readRDS(file = rds_path) 
testdf 

爲什麼兩種不同的做法? save() - 環境方法適用於創建一個您可以稍後恢復的整個環境的檢查點 - 這正是R使用它的原因 - 但僅此而已。這太容易了這樣的環境讓雜亂的,如果一個對象,你load()具有相同的名稱,在當前環境中的對象,將會覆蓋對象

testdf$z <- "blah" 
load(savepath) 
testdf # testdf$z is gone 

的RDS方法讓您指定讀取的名字,正如你想要在這裏做的那樣。當然,保存多個對象會更麻煩一些,但是不管怎樣,您可能不應該經常保存對象 - 從頭開始​​重新創建對象是確保您的R代碼按照您的想法操作的最佳方式。

+1

不錯,我們的答案並不完全重複,對他們有一些很好的補充。 – r2evans

+0

我認爲你的覆蓋物體的粗體評論不能被誇大。更重要的一點是,它無聲無息地覆蓋它,沒有任何指示,消息或警告。用戶將必須做的唯一的暗示是未來的計算可能不符合先前的結果。 (我從痛苦的經歷中發言...) – r2evans

+0

@ r2evans同樣在這裏。 :( –