在 R 中自动生成模型输出
Automating the generation of model output in R
我有一个 R 命令列表,首先通过 RODBC 从 SQL 数据库中获取数据,计算计算字段,然后将回归模型(在我的 R 环境中指定为 "objModel")应用于数据。最终输出是一个包含两列(联系人 ID,Probability_Score)的 csv 文件。我如何使用 Rscript 来自动执行 运行 脚本的过程并每天检索新的 csv 文件? R 必须一直是 运行 吗?
我在 Windows 环境中工作。我对 Rscript 没有任何经验。非常感谢您回答中的任何额外细节。
这个问题在评论和聊天中出现了一些不明确的情况:
1。对象持久化
objModel
是一个 ~90MB 的模型,随着时间的推移构建,其中包含大量不需要每次都重建的数据。
考虑到这一点,您的首要任务是使该数据在不同的 R 会话中保持不变。只需使用 save
和 load
即可轻松完成此操作。在当前会话中:
save(objModel, func1, func2, file="objModel.Rdata") # assuming a relevant directory
这假定这些是脚本所依赖的环境中唯一的依赖对象。 (它可以接受任意数量的对象,因此请根据需要添加。)
您的独立脚本应该类似于以下内容(稍后我将称为 myscript.R
):
# library(...) as necessary
load("objModel.Rdata")
# now have objModel, func1, func2 in your environment
# ...
# do your RODBC magic
# then your regression/prediction magic
# ...
write.csv(newresults, file="output.csv", header=......)
代码技巧:
- 永远不要假设人类互动。
- 您是否记得 save/load 或重新创建所有需要的变量?很容易忘记脚本所依赖的当前环境中的变量,并且在 vanilla Rscript 环境中将不可用。
- 密谋什么?使用
png
、pdf
或其他方式直接保存到图像文件。
- 如果您有重要步骤,请考虑异常处理 (
tryCatch
)。
- 无论如何,在将结果写入输出文件之前,您应该对结果的有效性进行简单检查 ("assertion"),无论您是否覆盖了某些内容。这可能很简单,如
if (! is.null(...))
或 if (length(...))
.
2。自动化
现在,您的实际问题来了:如何在日常无监督执行中自动执行此操作。在您可以通过新命令 window.
成功完成之前,甚至不要查看 cron 或 windows 计划
也就是说,你能运行Rscript /path/to/myscript.R
并且运行成功吗?您可能需要使用 setwd(...)
强制使用当前工作目录,或者在 load
和 write.csv
函数调用中使用绝对路径名。我倾向于假设调度程序将从不同的目录 运行 进行处理,因此我会以一种或另一种方式强制执行它。
一旦效果令人满意(您是否检查了输出 CSV 以确保它看起来正确?),现在您才应该考虑实际自动化它。
3。自动化,这次是真的。
如果您使用的是 unixy OS(您从未指定),请查看 cron。也许是这样的:
17 04 * * * /usr/bin/Rscript /path/to/myscript.R
这将 运行 该命令每天在 4:17am。
如果在 windows 上,@MrFlick 的评论是合适的:whosebug.com/q/2793389/2372064.
我有一个 R 命令列表,首先通过 RODBC 从 SQL 数据库中获取数据,计算计算字段,然后将回归模型(在我的 R 环境中指定为 "objModel")应用于数据。最终输出是一个包含两列(联系人 ID,Probability_Score)的 csv 文件。我如何使用 Rscript 来自动执行 运行 脚本的过程并每天检索新的 csv 文件? R 必须一直是 运行 吗? 我在 Windows 环境中工作。我对 Rscript 没有任何经验。非常感谢您回答中的任何额外细节。
这个问题在评论和聊天中出现了一些不明确的情况:
1。对象持久化
objModel
是一个 ~90MB 的模型,随着时间的推移构建,其中包含大量不需要每次都重建的数据。
考虑到这一点,您的首要任务是使该数据在不同的 R 会话中保持不变。只需使用 save
和 load
即可轻松完成此操作。在当前会话中:
save(objModel, func1, func2, file="objModel.Rdata") # assuming a relevant directory
这假定这些是脚本所依赖的环境中唯一的依赖对象。 (它可以接受任意数量的对象,因此请根据需要添加。)
您的独立脚本应该类似于以下内容(稍后我将称为 myscript.R
):
# library(...) as necessary
load("objModel.Rdata")
# now have objModel, func1, func2 in your environment
# ...
# do your RODBC magic
# then your regression/prediction magic
# ...
write.csv(newresults, file="output.csv", header=......)
代码技巧:
- 永远不要假设人类互动。
- 您是否记得 save/load 或重新创建所有需要的变量?很容易忘记脚本所依赖的当前环境中的变量,并且在 vanilla Rscript 环境中将不可用。
- 密谋什么?使用
png
、pdf
或其他方式直接保存到图像文件。 - 如果您有重要步骤,请考虑异常处理 (
tryCatch
)。 - 无论如何,在将结果写入输出文件之前,您应该对结果的有效性进行简单检查 ("assertion"),无论您是否覆盖了某些内容。这可能很简单,如
if (! is.null(...))
或if (length(...))
.
2。自动化
现在,您的实际问题来了:如何在日常无监督执行中自动执行此操作。在您可以通过新命令 window.
成功完成之前,甚至不要查看 cron 或 windows 计划也就是说,你能运行Rscript /path/to/myscript.R
并且运行成功吗?您可能需要使用 setwd(...)
强制使用当前工作目录,或者在 load
和 write.csv
函数调用中使用绝对路径名。我倾向于假设调度程序将从不同的目录 运行 进行处理,因此我会以一种或另一种方式强制执行它。
一旦效果令人满意(您是否检查了输出 CSV 以确保它看起来正确?),现在您才应该考虑实际自动化它。
3。自动化,这次是真的。
如果您使用的是 unixy OS(您从未指定),请查看 cron。也许是这样的:
17 04 * * * /usr/bin/Rscript /path/to/myscript.R
这将 运行 该命令每天在 4:17am。
如果在 windows 上,@MrFlick 的评论是合适的:whosebug.com/q/2793389/2372064.