R函数掩盖了data.table和lubridate之间的范围冲突

时间:2017-04-14 17:16:12

标签: r scope data.table lubridate

编辑:请参阅下面的简单修复。

我遇到了一些奇怪的行为。当我在案例1中明确地命名库时,通过lapply数据j表达式中的多个函数应用。在案例2中,如果我没有命名库,则它首先工作时间,但如果我第二次调用同一行,它将失败并显示错误消息:Error in FUN(X[[i]], ...) : could not find function "f"

# Case 1
unloadNamespace('data.table')
unloadNamespace('lubridate')
require(data.table)
require(lubridate)
dt <- data.table(x=as.POSIXct("2013-01-01 00:53:00", tz="Japan"))
dt[, c('year','month', 'day') := lapply(c(lubridate::year, lubridate::month, lubridate::day), function(f) f(x) )] # passes
dt[, c('year','month', 'day') := lapply(c(lubridate::year, lubridate::month, lubridate::day), function(f) f(x) )] # passes

# Case 2
unloadNamespace('data.table')
unloadNamespace('lubridate')
require(data.table)
require(lubridate)
dt <- data.table(x=as.POSIXct("2013-01-01 00:53:00", tz="Japan"))
dt[, c('year','month', 'day') := lapply(c(year, month, day), function(f) f(x) )] # passes
dt[, c('year','month', 'day') := lapply(c(year, month, day), function(f) f(x) )] # fails

造成这种奇怪行为的原因是什么?除显式范围lubridate::function之外是否有其他解决方案?

编辑:

根据下面@ Frank的评论,问题是data.tableyearmonth解释为引用其列而不是lubridate函数。更改列名称修复了它:

# Case 2
unloadNamespace('data.table')
unloadNamespace('lubridate')
require(data.table)
require(lubridate)
dt <- data.table(x=as.POSIXct("2013-01-01 00:53:00", tz="Japan"))
dt[, c('y1','y2', 'y3') := lapply(c(year, month, day), function(f) f(x) )] # passes
dt[, c('y1','y2', 'y3') := lapply(c(year, month, day), function(f) f(x) )] # passes

但是,根据@FrankH的评论,最好明确指定lubridate::function以消除对两个软件包中的哪一个屏蔽另一个软件包的任何疑问。

0 个答案:

没有答案