【问题标题】:Error with Rscript call, but not R IDERscript 调用出错,但不是 R IDE
【发布时间】:2015-03-10 18:59:56
【问题描述】:

我将一些数据从 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 调用 (Mac OSX):

Rscript my_file.R 'my_thing'

来自 Rstudio 的电话:

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

错误消息(与 Rstudio 中的 shell 或 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() 停止执行失败:

我的文件.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)。

【问题讨论】:

  • 发布整个脚本。您没有提供足够的信息来诊断问题。 as.Date 函数是泛型的,数字和字符方法有不同的参数。

标签: r date type-conversion


【解决方案1】:

事实证明,我的一个 Rscript 调用中有一个空格(例如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 将问题分解为最简单形式的建议非常棒。

【讨论】:

  • 是的,当您有 numeric 输入数据到as.Date() 时,原点是强制性的。
【解决方案2】:

一个典型的区别是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,这表明您可能在一种情况下给出了因素,而不是在另一种情况下。鉴于我们没有你的剧本,很难说更多。

【讨论】:

  • 谢谢 Dirk,我提供了更多细节。我也注意到了as.Date.numeric,但不能说为什么它被用于似乎是字符向量的东西。
  • 进一步降低它。检索一些数据,对它执行dput() 并简化脚本,直到您没有错误——或者没有进一步的library() 调用。我们无法测试,因为我们没有您的数据库。
  • 谢谢,您的建议帮助我缩小范围并弄明白。如果有人遇到它,我将其发布为答案。
猜你喜欢
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 2013-11-15
  • 2017-03-31
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多