r - data.table 1.10.0 - 为什么命名列索引值不起作用而整数列索引值不使用= FALSE

iem*_*bry 6 r data.table

我使用的是data.table1.10.0.

# install.packages("install.load") # install in order to use the load_package function
install.load::load_package("data.table", "gsubfn", "fpCompare")

# function to convert from fractions and numeric numbers to numeric (decimal)
# Source 1 begins
to_numeric <- function(n) {
    p <- c(if (length(n) == 2) 0, as.numeric(n), 0:1)
    p[1] + p[2] / p[3]
}
# Source 1 ends
Run Code Online (Sandbox Code Playgroud)

源1是将混合数,分数和整数的字符向量转换为数字

max_size_aggr <- 3 / 4

water_nonair <- structure(list(`Slump (in.)` = c("1 to 2", "3 to 4", "6 to 7",
"Approximate amount of entrapped air in nonair- entrained concrete (%)"), `3/8 in.` =
c(350, 385, 410, 3), `1/2 in.` = c(335, 365, 385, 2.5), `3/4 in.` = c(315, 340, 360, 2),
`1 in.` = c(300, 325, 340, 1.5), `1 1/2 in.` = c(275, 300, 315, 1), `2 in.` =
 c(260, 285, 300, 0.5), `3 in.` = c(220, 245, 270, 0.3), `6 in.` = c(190, 210, NA, 0.2)),
 .Names = c("Slump (in.)", "3/8 in.", "1/2 in.",
 "3/4 in.", "1 in.", "1 1/2 in.", "2 in.", "3 in.", "6 in."), row.names = c(NA, -4L),
 class = c("data.table", "data.frame"))

setnames(water_nonair, c("Slump (in.)", "3/8 in.", "1/2 in.", "3/4 in.", "1 in.",
"1 1/2 in.", "2 in.", "3 in.", "6 in."))

water_nonair_col_numeric <- gsub(" in.", "", colnames(water_nonair)[2:ncol(water_nonair)])

water_nonair_col_numeric <- sapply(strapplyc(water_nonair_col_numeric, "\\d+"), to_numeric)
# Source 1
Run Code Online (Sandbox Code Playgroud)

新方式(data.table1.10.0)

water_nonair_column <- which(water_nonair_col_numeric %==% max_size_aggr)+1L
# [1] 4

water_nonair[2, water_nonair_column][[1]]
# [1] 4
Run Code Online (Sandbox Code Playgroud)

当我调用列索引时,为什么以下工作正常,但是上面的值也是4,不起作用?

water_nonair[2, 4][[1]]
# [1] 340
Run Code Online (Sandbox Code Playgroud)

旧路(data.table1.9.6)

water_nonair[2, which(water_nonair_col_numeric %==% max_size_aggr)+1L, with = FALSE][[1]]
# [1] 340
Run Code Online (Sandbox Code Playgroud)

我在1.9.8版本发布with = FALSE后阅读data.table新闻后删除了该功能.

Mat*_*wle 17

v1.9.8 NEWS中的长注3开始:

当j不包含任何不带引号的变量名(无论是否为列名)时,with=现在自动设置为FALSE.因此......

但是你j 确实包含一个不带引号的变量名.实际上,它只是一个不带引号的变量名.所以该项目不适用于它.

这就是它的意义,options(datatable.WhenJisSymbolThenCallingScope=TRUE)所以你可以尝试新的功能.请再次阅读相同的新闻项目.如果您设置该选项,它将按预期工作.

不过请不要.因为昨天我改变它并且在开发中这个选项现在已经消失了.不再需要迁移时间表.新策略不需要更改代码,也没有破损.请参阅最新开发新闻v1.10.1中的新注释.我不会在这里复制它们以节省重复.

所以今后,当你j是一个符号(即一个不带引号的变量名)时,你仍然需要with=FALSE:

water_nonair[2, water_nonair_column, with=FALSE]
Run Code Online (Sandbox Code Playgroud)

或者您可以使用..昨天添加的v1.10.1 的新前缀:

water_nonair[2, ..water_nonair_column]
Run Code Online (Sandbox Code Playgroud)

否则,如果j是符号,则必须是列名,以确保安全性,一致性和向后兼容性.如果没有,您现在将获得新的更有用的错误消息:

DT = data.table(a=1:3, b=4:6)
myCols = "b"
DT[,myCols]
Error in `[.data.table`(DT, , myCols) : 
  j (the 2nd argument inside [...]) is a single symbol but column name 
  'myCols' is not found. Perhaps you intended DT[,..myCols] or
  DT[,myCols,with=FALSE]. This difference to data.frame is deliberate 
  and explained in FAQ 1.1.
Run Code Online (Sandbox Code Playgroud)

正如NEWS中所提到的,我重新使用所有313 CRAN和Bioconductor包,这些包对data.table v1.10.1使用data.table,其中2个确实打破了这一变化.但这就是我们想要的,因为它们确实有一个错误(j调用范围的值正在按字面意思返回,这不是预期的).我告诉他们的维护者.这正是我们想要揭示和改进的.其他311个包都通过了这个改变.它不依赖于测试覆盖率(许多软件包都很弱).当j符号不是列时,是否存在对结果的测试时,会发生新错误.