如何在R窗口中打开R数据文件

时间:2017-04-13 16:58:36

标签: 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”

如何查看数据?

2 个答案:

答案 0 :(得分: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$x函数时,您无法执行mean。)无论如何,即使此修改后的错误消息不那么令人困惑,仍然没有清楚地告诉您什么/哪里问题就在于此。

因此,许多经验丰富的程序员会建议您使用唯一的变量名称(可能不仅仅是x :-)。如果您使用我的建议并将其命名为dat,那么不预加载数据的错误将改为:

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

更有意义且更容易排除故障。

答案 1 :(得分:1)

有两种方法可以保存R对象,并且它们已经混淆了。在第一种方式中,您save()将任何对象对象集合到文件中。当您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代码完成你认为它的功能的最佳方法。