为什么load(...)返回对象的字符名而不是对象本身?

时间:2014-06-12 22:36:53

标签: r save svm

使用R中的包 e1071 创建svm模型。要使用该模型,我需要保存并根据需要进行读取。该软件包有write.svm,但没有read.svm。如果我使用

model <- svm(x, y)

save(model, 'modelfile.rdata')
M <- load('modelfile.rdata')

对象M只包含单词&#39; model&#39;。

如何保存svm模型并稍后回读,以应用于某些新数据?

2 个答案:

答案 0 :(得分:6)

查看帮助文件中函数load的返回值:

  

值:

 A character vector of the names of objects created, invisibly.

所以&#34;模特&#34;确实是M的期望值。您的svm已恢复为原始名称,即model

如果您发现load没有返回加载的对象,而是使用保存时使用的名称恢复它,有点令人困惑,请考虑使用saveRDSreadRDS

saveRDS(model, 'modelfile.rds')
M <- readRDS('modelfile.rds')

M应包含您的svm模型。

我更喜欢saveRDSreadRDS因为我知道我在工作区中创建了哪些对象 - 请参阅Gavin Simpson的博客文章(在他的回答中链接)进行详细讨论

答案 1 :(得分:3)

你误解了load的作用。它会将对象恢复为save()时的对象名称。您在M中看到的是load()函数的返回值。调用load()会产生额外的副作用,即以与保存对象相同的名称加载对象。

考虑:

require("e1071")
data(iris)

## classification mode
# default with factor response:
model <- svm (Species~., data=iris)
## Save it
save(model, file = "my-svm.RData")
## delete model
rm(model)
## load the model
M <- load("my-svm.RData")

现在看看工作区

> ls()
[1] "iris"  "M"     "model"

因此model已恢复为load()的副作用。

?load我们看到原因M包含创建的对象的名称(因此最初保存)

Value:

     A character vector of the names of objects created, invisibly.

如果要将对象还原为新名称,请使用saveRDS()readRDS()

saveRDS(model, "svm-model.rds")
newModel <- readRDS( "svm-model.rds")
ls()

> ls()
 [1] "iris"     "M"        "model"    "newModel"

如果您想了解有关saveRDS()readRDS()的详情,请参阅相关帮助?saveRDS(),您可能会对blog post I wrote on this topic感兴趣。