6

这里发生了一些非常奇怪的事情。在下面的代码中,我创建了一个名为temp. 我必须调用它两次才能看到它是什么。例如,我第一次调用它时,控制台什么也没有显示。它第二次显示data.table/data.frame它是。谁能帮我理解这里发生了什么?

library(magrittr)
library(data.table)

myDT <- as.data.table(mtcars)


temp <- 
    myDT %>%
    melt(id.vars = c('cyl', 'mpg', 'hp'), 
         measure.vars = c('vs','am','gear','carb'),
         variable.name = 'Data') %>%
    extract( value > 0) %>%
    extract( , value := NULL)

我的控制台在做什么(第一次调用没有做任何事情):

> temp
> temp
    cyl  mpg  hp Data
 1:   4 22.8  93   vs
 2:   6 21.4 110   vs
 3:   6 18.1 105   vs
 4:   4 24.4  62   vs
 5:   4 22.8  95   vs
 ...
 ...
4

1 回答 1

9

这是为消除更大的错误而实施的修复程序的已知副作用。它被记录在这里,作为 v1.9.6 版本的“BUG FIXES”部分下的第一项。引用该链接:

if (TRUE) DT[,LHS:=RHS] 不再打印,#869 和 #1122。添加了测试。为了让它工作,我们不得不忍受一个缺点:如果在函数结束之前在没有 DT[] 的函数中使用 := ,那么下一次 DT 或 print(DT) 在提示,不会打印任何内容。将打印重复的 DT 或 print(DT)。为避免这种情况:在函数的最后一个 := 之后包含一个 DT[]。如果这是不可能的(例如,它不是您可以更改的函数),则保证在提示符处打印 DT[]。和以前一样,在 := 查询的末尾添加一个额外的 [] 是一个推荐的习惯用法来更新然后打印;例如 > DT[,foo:=3L][]。感谢 Jureiss 和 Jan Gorecki 的报道。

正如那里所解释的,解决方案是在函数中[]包含 final的操作后面附加一个尾随。:=在这里,这意味着执行以下操作:

library(magrittr)
library(data.table)    
myDT <- as.data.table(mtcars)
temp <- 
    myDT %>%
    melt(id.vars = c('cyl', 'mpg', 'hp'), 
         measure.vars = c('vs','am','gear','carb'),
         variable.name = 'Data') %>%
    extract( value > 0) %>%
    extract( , value := NULL) %>% `[`

## Following which, this will print the first time
temp
于 2016-01-08T01:26:00.833 回答