我有一个R命令列表,首先通过RODBC从SQL数据库中获取数据,计算计算字段,然后将回归模型(在我的R环境中分配为"objModel")应用于数据。最后的输出是一个csv文件,包含两列(Contact id, Probability_Score)。我如何使用Rscript来自动化运行脚本和每天检索新csv文件的过程?R必须一直运行吗?我在Windows环境下工作。我对Rscript没有任何经验。如果您的回答中有任何额外的细节,我们将不胜感激。
这个问题在评论和聊天中出现了一些不明确的条件:
1。对象持久性
objModel
是一个约90MB的模型,随着时间的推移建立了大量的数据,不需要每次都重建。
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=......)
代码的窍门:
- 永远不要假设人类互动。
- 你记得保存/加载或重新创建所有需要的变量吗?在当前环境中很容易忘记脚本所依赖的变量,而该变量在普通Rscript环境中不可用。
- 策划什么?使用
png
,pdf
,或其他直接保存到图像文件。 - 考虑异常处理(
tryCatch
)如果你有重要的步骤。 无论如何,在将结果写入输出文件之前,无论是否覆盖某些内容,都应该对结果的有效性进行简单检查("断言")。可以是简单的
if (! is.null(...))
或if (length(...))
。2。自动化
现在,你的实际问题来了:如何在日常无监督执行中自动执行此操作。在你能从一个新的命令窗口成功地执行cron或windows调度之前,甚至不要看它。
也就是说,您可以运行Rscript /path/to/myscript.R
并使其成功运行吗?您可能需要使用setwd(...)
强制执行当前工作目录,或者在load
和write.csv
函数调用中使用绝对路径名。我倾向于假设调度程序将从另一个目录运行东西,所以我强制它以一种方式运行。
一旦它令人满意地工作(您检查输出CSV以确保它看起来正确吗?),只有现在才应该考虑实际自动化它。
3。自动化,这次是真的。
如果您使用的是unix操作系统(您从未指定),请查看cron。比如:
17 04 * * * /usr/bin/Rscript /path/to/myscript.R
,它将在每天凌晨4:17运行命令。
如果在windows上,@MrFlick的评论是合适的:stackoverflow.com/q/2793389/2372064.