【问题标题】:Inhibit Copy On Modify In "R" Function Argument Data Tables?在“R”函数参数数据表中禁止修改时复制?
【发布时间】:2017-05-20 20:22:33
【问题描述】:

作为函数参数传递的不合格数据表是可以修改的,无需在修改时复制:

dt<-data.table(RowId=c('a','b','c','d'),x=0:3)
f<-function(adt){adt[,x:=4]}
f(dt)
dt
#   RowId x
#1:     a 4
#2:     b 4
#3:     c 4
#4:     d 4

我想在一组受限制的行上保留此行为,如下所示:

f(dt[x>1])
dt
#   RowId x
#1:     a 0
#2:     b 1
#3:     c 4
#4:     d 4

而不是必须在函数中嵌入限制或将限制作为要在函数中评估的参数传递。

有没有办法做到这一点?

如果不是,替换函数返回的副本中对应的dt 行的最简洁的方法是什么?

【问题讨论】:

    标签: r data.table pass-by-reference


    【解决方案1】:

    据我所知你不能。

    但你可以做到

    myfun <-function (x){
        4
    }
    
    dt[x>1,x:=myfun(x)]
    

    【讨论】:

    • 为什么它比目前允许的第一种情况更危险?
    • 如果function 修改甚至初始化多个列怎么办?
    • 你是对的,它并不比第一种情况更危险。如果你想要一个修改多个列的函数看看here
    • 看起来它是通过表达式DT[, c("new1","new2") := myfun(y,v)] 到达那里的,但是这依赖于知道返回列的顺序而不是它们的名称。
    • 这个怎么样:dt[f(dt[x&gt;1]),x:=i.x,on="RowId"]
    【解决方案2】:

    这就是我最终做的:

    dt[f(dt[x&gt;1]),x:=i.x,on="RowId"]

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 2023-02-23
      • 2023-04-10
      • 2017-12-20
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多