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 将问题分解为最简单形式的建议非常好。
我正在从 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 将问题分解为最简单形式的建议非常好。