分配有:=FROM函数的data.table对象未打印

我想修改data.table在一个功能范围内。如果我使用:=函数中的特性,结果仅用于第二次调用。


请看下面的插图:


library(data.table)

mydt <- data.table(x = 1:3, y = 5:7)


myfunction <- function(dt) {

    dt[, z := y - x]

    dt

}

当我只调用函数时,表就不会打印(这是标准行为)。但是,如果我保存返回的data.table在一个新的对象中,它不是在第一个调用时打印出来的,而是为第二个调用而打印的。


myfunction(mydt)  # nothing is printed   

result <- myfunction(mydt) 

result  # nothing is printed

result  # for the second time, the result is printed

mydt                                                                     

#    x y z

# 1: 1 5 4

# 2: 2 6 4

# 3: 3 7 4 

你能解释一下为什么会发生这种情况吗?如何防止?


犯罪嫌疑人X
浏览 388回答 2
2回答

Helenr

我很抱歉,如果我不应该在这里发布一些东西,这不是一个答复,但我的帖子太长,不能发表评论。我想指出的是,Janosdivenyi的解决方案是添加一个尾随[]到dt并不总是像下面这样给出预期的结果(即使使用data.table 1.9.6或1.10.4)。下面的例子表明,如果dt是函数中的最后一行,可以在没有尾随的情况下获得所需的行为。[],但是如果dt不位于函数的最后一行,则为拖尾。[]才能得到想要的行为。第一个例子显示,没有尾随[]在……上面dt我们得到了预期的行为dt在函数的最后一行mydt&nbsp;<-&nbsp;data.table(x&nbsp;=&nbsp;1:3,&nbsp;y&nbsp;=&nbsp;5:7)myfunction&nbsp;<-&nbsp;function(dt)&nbsp;{ &nbsp;&nbsp;df&nbsp;<-&nbsp;1 &nbsp;&nbsp;dt[,&nbsp;z&nbsp;:=&nbsp;y&nbsp;-&nbsp;x]}myfunction(mydt)&nbsp;&nbsp;#&nbsp;Nothing&nbsp;printed&nbsp;as&nbsp;expectedmydt&nbsp;&nbsp;#&nbsp;Content&nbsp;printed&nbsp;as&nbsp;desired##&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;x&nbsp;y&nbsp;z##&nbsp;1:&nbsp;1&nbsp;5&nbsp;4##&nbsp;2:&nbsp;2&nbsp;6&nbsp;4##&nbsp;3:&nbsp;3&nbsp;7&nbsp;4添加拖尾[]在……上面dt出其不意mydt&nbsp;<-&nbsp;data.table(x&nbsp;=&nbsp;1:3,&nbsp;y&nbsp;=&nbsp;5:7)myfunction&nbsp;<-&nbsp;function(dt)&nbsp;{ &nbsp;&nbsp;df&nbsp;<-&nbsp;1 &nbsp;&nbsp;dt[,&nbsp;z&nbsp;:=&nbsp;y&nbsp;-&nbsp;x][]}myfunction(mydt)&nbsp;&nbsp;#&nbsp;Content&nbsp;printed&nbsp;unexpectedly##&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;y&nbsp;z##&nbsp;1:&nbsp;1&nbsp;5&nbsp;4##&nbsp;2:&nbsp;2&nbsp;6&nbsp;4##&nbsp;3:&nbsp; &nbsp;&nbsp;3&nbsp;7&nbsp;4mydt&nbsp;&nbsp;#&nbsp;Content&nbsp;printed&nbsp;as&nbsp;desired##&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;y&nbsp;z##&nbsp;1:&nbsp;1&nbsp;5&nbsp;4##&nbsp;2:&nbsp;2&nbsp;6&nbsp;4##&nbsp;3:&nbsp;3&nbsp;7&nbsp;4移动df <- 1在DT之后没有尾随[]出其不意mydt&nbsp;<-&nbsp;data.table(x&nbsp;=&nbsp;1:3,&nbsp;y&nbsp;=&nbsp;5:7)myfunction&nbsp;<-&nbsp;function(dt)&nbsp;{ &nbsp;&nbsp;dt[,&nbsp;z&nbsp;:=&nbsp;y&nbsp;-&nbsp;x] &nbsp;&nbsp;df&nbsp;<-&nbsp;1}myfunction(mydt)&nbsp;&nbsp;#&nbsp;Nothing&nbsp;printed&nbsp;as&nbsp;expectedmydt&nbsp;&nbsp;#&nbsp;Nothing&nbsp;printed&nbsp;unexpectedly移动df <- 1在DT后面有一个尾随[]给出预期的行为mydt&nbsp;<-&nbsp;data.table(x&nbsp;=&nbsp;1:3,&nbsp;y&nbsp;=&nbsp;5:7)myfunction&nbsp;<-&nbsp;function(dt)&nbsp;{ &nbsp;&nbsp;dt[,&nbsp;z&nbsp;:=&nbsp;y&nbsp;-&nbsp;x][] &nbsp;&nbsp;df&nbsp;<-&nbsp;1}myfunction(mydt)&nbsp;&nbsp;#&nbsp;Nothing&nbsp;printed&nbsp;as&nbsp;expectedmydt&nbsp;&nbsp;#&nbsp;Content&nbsp;printed&nbsp;as&nbsp;desired##&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;x&nbsp;y&nbsp;z##&nbsp;1:&nbsp;1&nbsp;5&nbsp;4##&nbsp;2:&nbsp;2&nbsp;6&nbsp;4##&nbsp;3:&nbsp;3&nbsp;7&nbsp;4
打开App,查看更多内容
随时随地看视频慕课网APP