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

Mar*_*ina 7 r save svm

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

model <- svm(x, y)

save(model, 'modelfile.rdata')
M <- load('modelfile.rdata')
Run Code Online (Sandbox Code Playgroud)

对象M只包含"模型"这个词.

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

Jam*_*ing 6

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

值:

 A character vector of the names of objects created, invisibly.
Run Code Online (Sandbox Code Playgroud)

所以"模型"确实是预期的价值M.你的svm已恢复原来的名字,即model.

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

saveRDS(model, 'modelfile.rds')
M <- readRDS('modelfile.rds')
Run Code Online (Sandbox Code Playgroud)

M应包含您的svm模型.

我更喜欢saveRDS,readRDS因为有了他们,我知道我在工作区中创建了什么对象 - 请参阅Gavin Simpson的博客文章(在他的回答中链接)进行详细讨论.


Rei*_*son 5

你误解了什么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")
Run Code Online (Sandbox Code Playgroud)

现在看看工作区

> ls()
[1] "iris"  "M"     "model"
Run Code Online (Sandbox Code Playgroud)

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

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

Value:

     A character vector of the names of objects created, invisibly.
Run Code Online (Sandbox Code Playgroud)

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

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

> ls()
 [1] "iris"     "M"        "model"    "newModel"
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多信息saveRDS()readRDS()查看相关帮助,您可能会对我就此主题撰写的博客文章?saveRDS()感兴趣。