我无法在函数中添加太多列。在功能之外很好。
g <- function(d,n=200){
#create n columns
for (ii in 1:n){
cname = paste0('x',ii)
d[,c(cname):= ii]
}
#remove n-5 columns
for (ii in 1:(n-5)){
cname = paste0('x',ii)
d[,c(cname):= NULL]
}
}
d = data.table(a=1:10)
g(d,1023)
print(d)
print(dim(d))
#[1] 10 6
d = data.table(a=1:10)
g(d,1025)
print(dim(d))
#[1] 10 1025
#R 4.0.2
#data.table 1.13.0发布于 2022-08-04 06:19:50
请把这个带到data.table错误追踪器。它看起来像是一个与过度分配有关的错误。第二种情况所需的truelength增加会导致内存地址的更改,但这种更改并不绑定到函数之外的引用。
library(data.table) #version 1.14.2
g <- function(d,n=200){
#create n columns
for (ii in 1:n){
cname = paste0('x',ii)
d[,c(cname):= ii]
}
message("truelength is: ", truelength(d))
message("length is: ", length(d))
#remove n-5 columns
for (ii in 1:(n-5)){
cname = paste0('x',ii)
set(d, j = cname, value = NULL)
}
}
d = data.table(a=1:10)
truelength(d)
#[1] 1025
g(d,1023)
#truelength is: 1025
#length is: 1024
truelength(d)
#[1] 1025
length(d)
#[1] 6
d = data.table(a=1:10)
g(d,1025)
#truelength is: 2050
#length is: 1026
truelength(d)
#[1] 1025
length(d)
#[1] 1025
tail(names(d))
#[1] "x1019" "x1020" "x1021" "x1022" "x1023" "x1024"
#column x1025 has not been created at the original address现在,您可以通过在调用g之前过多分配更多列来解决这个问题。
d = data.table(a=1:10)
setalloccol(d, 2050)
g(d,1025)
#truelength is: 2051
#length is: 1026
print(dim(d))
#[1] 10 6或者让函数返回data.table。
https://stackoverflow.com/questions/73230646
复制相似问题