R和Rscript在日期时间方面给出不同的结果

7

当我在RStudio上尝试执行以下代码时

library(lubridate)
library(data.table)

a <- data.frame(c("2017-12-01 00:01:00","2017-12-02 00:01:00"),c(5,6))
colnames(a) <- c("t", "x")
a <- as.data.table(a)
a[, t := parse_date_time(t, orders = "ymd HMS")]
print(class(a$t))
paste("a:", format(a[1,1], format = "%Y-%m-%d %H:%M:%S"))

我有以下结果:
[1] "a: 2017-12-01 00:01:00"

但是当我尝试在Rscript下运行同样的代码时,输出结果是:

[1] "a: 1"

有没有和我遇到同样问题的人?非常感谢任何帮助。

编辑:R版本3.3.1,平台x86_64-w64-mingw32/x64。

Windows服务器2012版本:

主要版本 次要版本 构建版本 修订版本

6 2 9200 0


2
对我来说,两者都给出了相同的输出。 - sm925
如果可以的话,请清理您的环境并重新运行代码块。 - Onyambu
2
你能在两个环境中运行Sys.getlocale()并将输出粘贴在这里吗? - Borislav Aymaliev
3
对我来说,这个脚本使得Rscript自动加载'methods'包(并显示一条消息)。在交互式的R环境中,'methods'是一个始终被加载的核心包之一,但是历史上它没有被Rscript加载,所以我怀疑自动加载是最近的变化。尝试更新R软件和/或在脚本中明确添加'library(methods)'。 - alistaire
时区:(UTC-03:00)巴西利亚 - Lucio Carlos Pimentel Paiva
显示剩余6条评论
1个回答

2
实际问题出在data.table上。在早期版本的data.table中,如果我们使用数字索引而没有使用“with=FALSE”,那么它将返回数字索引本身。因此,在问题中分享了输出结果。关于这个问题的详细信息,可以查阅data.table的文档。
然而,在最近的data.table版本中,这个问题已经得到解决,因此,data.table几乎像data.frame一样工作。这就是为什么没有人能够复制问题中分享的输出的原因。
以下是使用“with=FALSE”选项与data.table的更新代码。
library(lubridate)
library(data.table)

a <- data.frame(c("2017-12-01 00:01:00","2017-12-02 00:01:00"),c(5,6), stringsAsFactors=FALSE) # stringsAsFactors=TRUE
colnames(a) <- c("t", "x")
a$t1 <- parse_date_time(a$t, orders = "ymd HMS")
a <- as.data.table(a)
a[, t := parse_date_time(as.character(t), orders = "ymd HMS")]
print(class(a$t))
paste("a:", format(a[1,1, with=FALSE], format = "%Y-%m-%d %H:%M:%S"))

您可以使用 sessionInfo() 了解软件包版本信息。通过软件包版本,可以确定问题所在。

问题仍然存在。我正在使用的data.tablelubridate版本是data.table_1.9.6 lubridate_1.6.0 - Lucio Carlos Pimentel Paiva
1
重新考虑后,问题可能出在data.table上。因此,在data.table中添加with=FALSE。希望这能解决你的问题。请参见链接https://dev59.com/QWYr5IYBdhLWcg3wy9OA。 - Kumar Manglam
使用 with=FALSE 真是太好用了!非常感谢。请更新您的答案。 - Lucio Carlos Pimentel Paiva
更新了我的回答。@Lucio Carlos Pimentel Paiva,不客气。 - Kumar Manglam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接