我在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 :(得分: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代码完成你认为它的功能的最佳方法。