我正在尝试编写一个包cleanstreets
,其中包含我为自己编写的一些使用data.table
的函数。
使用data.table
的{{1}}运算符似乎在我的包函数中使用它时会抛出错误,但是如果我将代码剪切/粘贴到普通的旧R脚本中,或者甚至放入它在我在同一个脚本中定义的函数中,它工作正常。
例如,当我在R Studio中将其作为脚本运行时,在我尝试将该函数用作打包时,不会抛出任何错误...
:=
在包中我们有定义
rm(list = ls())
library(cleanstreets)
library(data.table)
DumbFunction <- function(char.vector) {
library(data.table)
dt <- data.table(original = as.character(char.vector))
dt[,three := substr(original,1,3),]
return (dt)
}
test.vec <- c("One Thing","Two Things","Three things")
dt <- data.table(original = test.vec)
dt[,three := substr(original,1,3),] # this doesn't throw an error
dt.from.local.function <- DumbFunction(test.vec)
dt.from.package.function <- DumbPackageFunction(test.vec)
只有最后一行才会抛出错误:
DumbPackageFunction <- function(char.vector) {
library(data.table)
print(search())
dt <- data.table(original = as.character(char.vector))
dt[,three := substr(original,1,3),]
return (dt)
}
我觉得我错过了关于命名空间如何在包中工作的东西,但我不知道是什么,因为它似乎应该覆盖我Error in `:=`(three, substr(original, 1, 3)) :
Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
6.
stop("Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(\":=\").")
5.
`:=`(three, substr(original, 1, 3))
4.
`[.data.frame`(x, i, j)
3.
`[.data.table`(dt, , `:=`(three, substr(original, 1, 3)), ) at DumbPackageFunction.R#5
2.
dt[, `:=`(three, substr(original, 1, 3)), ] at DumbPackageFunction.R#5
1.
DumbPackageFunction(test.vec)
。我唯一的想法是,因为library(data.table)
不是一个函数,命名空间规则在它的包(或其他运算符?)中的工作方式不一样。
但是当我:=
内的print(search())
时,我看到DumbPackageFunction()
:
data.table