首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在函数中创建和删除太多列

无法在函数中创建和删除太多列
EN

Stack Overflow用户
提问于 2022-08-04 05:15:47
回答 1查看 52关注 0票数 1

我无法在函数中添加太多列。在功能之外很好。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 06:19:50

请把这个带到data.table错误追踪器。它看起来像是一个与过度分配有关的错误。第二种情况所需的truelength增加会导致内存地址的更改,但这种更改并不绑定到函数之外的引用。

代码语言:javascript
复制
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之前过多分配更多列来解决这个问题。

代码语言:javascript
复制
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。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73230646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档