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

时间:2016-01-08 00:17:09

标签: r data.table magrittr

这里真的很奇怪。在下面的代码中,我创建了一个名为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
 ...
 ...

1 个答案:

答案 0 :(得分:9)

这是用于压缩更大错误的修复程序的已知副作用。它记录了here,作为&#34; BUG FIXES&#34;中的第一项。 v1.9.6版本的部分。引用该链接:

  

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

正如在那里解释的那样,解决方案是在函数中附加一个尾随com.mchange.v2.c3p0.ComboPooledDataSource到最后的[] - 包含操作。在这里,这意味着要做到以下几点:

:=