在评估之前必须调用两次变量?

jks*_*612 6 r magrittr data.table

这里真的很奇怪.在下面的代码中,我创建了一个名为的变量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)
Run Code Online (Sandbox Code Playgroud)

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

> 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
 ...
 ...
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 9

这是为了压缩更大的bug而实现的修复的已知副作用.这里记录它作为v1.9.6版本"BUG FIXES"部分下的第一项.引用该链接:

if(TRUE)DT [,LHS:= RHS]不再打印,#869和#1122.测试补充说.为了实现这一点,我们不得不忍受一个缺点:如果a:=在函数结束之前没有DT []的函数内使用,那么下一次DT或print(DT)在函数结束时输入提示,什么都不打印.将打印重复的DT或打印(DT).为避免这种情况:在函数中包括最后一个:=后的DT [].如果那是不可能的(例如,它不是一个你可以改变的功能),那么保证在提示下打印DT [].和以前一样,在:= query的末尾添加一个额外的[]是一个推荐的更新然后再打印的习惯用法; 例如> DT [,foo:= 3L] [].感谢Jureiss和Jan Gorecki的报道.

正如那里所解释的那样,解决方案是在函数中附加一个尾随[]到最终包含:=的操作.在这里,这意味着要做以下事情:

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
Run Code Online (Sandbox Code Playgroud)