Rscript 调用出错,但不是 R IDE

Error with Rscript call, but not R IDE

我正在从 SQLite 数据库中将一些数据提取到 R 中的数据框中。其中一个字段是日期字段,在 R 中提取后显示为字符字段(使用 sqldf 包):

dat$dt    : chr  "2014-10-07" "2014-10-07" "2014-10-07" "2014-10-07" ...

我需要将其转换回日期。 在 Rstudio 中将此列转换为日期效果很好,但当我将文件作为 Rscript 调用时却不行。

日期转换调用:

dat$as_date <- as.Date(dat$run_date)

Shell调用(MacOSX):

Rscript my_file.R 'my_thing'

来自 Rstudio 的电话:

system(paste("Rscript my_file.R, 'my_thing'"))

错误消息(与 shell 或 Rstudio 中的 Rscript 调用相同):

Error in as.Date.numeric(dat$dt) : 
'origin' must be supplied
Calls: as.Date -> as.Date.numeric
Execution halted

我试过提供来源和格式,结果相同:

dat$as_date <- as.Date(dat$dt, format = '%Y-%m-%d')
dat$as_date <- as.Date(dat$dt, origin="1970-01-01")

为什么 as.Date() 转换在 IDE 中起作用,但不能作为 Rscript 调用,如何解决?

编辑:

感谢您到目前为止的输入,下面是脚本的相关部分(全部约 1000 行)。它从文件顶部开始,直到执行因 as.Date() 调用而停止的失败:

my_file.R:

#!/usr/bin/R
suppressMessages(require(sqldf))
suppressMessages(require(dplyr))
suppressMessages(require(reshape2))

args <- commandArgs(TRUE)
THING <- args[1]
sq <- dbConnect(SQLite(), dbname="db2.sqlite3")

dat <- dbGetQuery(conn = sq, sprintf('select * from db_table where db_thing=%s', paste(shQuote(THING),collapse=",")))

dat <- filter(dat, !grepl('exclude', comment))

dat$the_date <- as.Date(dat$dt)

我还编辑了 Rscript 调用,因为我确实包含了 args。

这是数据结构;没有我能看到的因素。

 'data.frame':  128 obs. of  2 variables:
 $ dt: chr  "2014-10-07" "2014-10-07" "2014-10-07" "2014-10-07" ...
 $ comment : chr  "" "" "" "" ...

日期字段在 R 之外的表现与预期一致(例如 SQL 和 python)。

其中一个经典差异是 Rscript 加载(内置)方法包。 所以我的第一个建议是在脚本的顶部添加一个 library("methods")

仔细观察,不是这样的:

edd@max:~$ Rscript -e 'print(as.Date("2014-01-07", format="%Y-%m-%d"))'     
[1] "2014-01-07"
edd@max:~$ 

此外,您有一个错误指示 as.Date.numeric,这表明您可能在一种情况下给出了因素,而在另一种情况下却没有。鉴于我们没有您的脚本,所以很难多说。

事实证明,我的一个 Rscript 调用中有一个 space(例如 Rscript my thing),因此数据框中没有数据,因此 as.Date()错误。

我能够如下模拟错误(对 Dirk 的支持):

Rscript -e 'print(as.Date(0, format="%Y-%m-%d"))'

Error in as.Date.numeric(0, format = "%Y-%m-%d") : 
'origin' must be supplied
Calls: print -> as.Date -> as.Date.numeric
Execution halted

对于系统调用,我在 Rscript 调用中添加了 shQuote(),这解决了问题。

my_thing = 'something with spaces'

system(paste("Rscript my_file.R, shQuote(my_thing)"))

TLDR:错误出在 Rscript 调用中,Dirk 将问题分解为最简单形式的建议非常好。