我想将lm
对象保存到文件中,并在另一个程序中重新加载它。 我知道可以使用saveRDS
/readRDS
通过写入/读取二进制文件来实现,但我希望有一个ASCII格式的文件。更一般地说,我想知道为什么我通常用于读取dput
输出的习惯用法没有按照我的预期那样工作。
以下是制作简单拟合的示例以及成功和失败重新创建模型的示例:
dat_train <- data.frame(x=1:4, z=c(1, 2.1, 2.9, 4))
fit <- lm(z ~ x, dat_train)
rm(dat_train) # Just to make sure fit is not dependent upon `dat_train existence`
dat_score <- data.frame(x=c(1.5, 3.5))
## This works (of course)
predict(fit, dat_score)
# 1 2
# 1.52 3.48
二进制文件保存可行:
## https://dev59.com/QW435IYBdhLWcg3w9FBY
saveRDS(fit, "model.RDS")
fit2 <- readRDS("model.RDS")
predict(fit2, dat_score)
# 1 2
# 1.52 3.48
这样做(将dput
应用于R会话而不是文件):
fit2 <- eval(dput(fit))
predict(fit2, dat_score)
# 1 2
# 1.52 3.48
但如果我将文件持久化到磁盘,我就不知道如何恢复正常状态:
dput(fit, file = "model.R")
fit3 <- source("model.R")$value
# Error in is.data.frame(data): object 'dat_train' not found
predict(fit3, dat_score)
# Error in predict(fit3, dat_score): object 'fit3' not found
试图显式使用 eval
也不起作用:
## https://dev59.com/SGox5IYBdhLWcg3wpV3F
dput(fit, file="model.R")
fit4 <- eval(parse(text=paste(readLines("model.R"), collapse=" ")))
# Error in is.data.frame(data): object 'dat_train' not found
predict(fit4, dat_score)
# Error in predict(fit4, dat_score): object 'fit4' not found
以上两种情况,我期望fit3
和fit4
都能正常工作,但它们无法重新编译为可用于predict()
的lm
对象。
请问有谁可以建议我如何将模型保存到一个具有类似ASCII结构的structure(...)
文件中,并将其作为lm
对象重新读取以便在predict()
中使用?另外,请问我的当前方法为什么不起作用?
dget
重新读取文件,但是我得到了错误信息“Error in eval(expr, envir, enclos) : object 'z' not found.”。dput/dget组合应该可以工作,但在这种情况下似乎并不起作用。 - Dave2e