编辑:请参阅下面的简单修复。
我遇到了一些奇怪的行为。当我在案例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.table
将year
和month
解释为引用其列而不是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
以消除对两个软件包中的哪一个屏蔽另一个软件包的任何疑问。