R 在求值之前必须调用变量两次吗?

R 在求值之前必须调用变量两次吗?,r,data.table,magrittr,R,Data.table,Magrittr,这里发生了一些非常奇怪的事情。在下面的代码中,我创建了一个名为temp的变量。我得打两次电话才能知道是什么。我第一次调用它时,控制台没有显示任何内容。第二次,它显示它所在的数据.table/数据.frame。有人能帮我理解这里发生了什么吗 library(magrittr) library(data.table) myDT <- as.data.table(mtcars) temp <- myDT %>% melt(id.vars = c('cyl',

这里发生了一些非常奇怪的事情。在下面的代码中,我创建了一个名为
temp
的变量。我得打两次电话才能知道是什么。我第一次调用它时,控制台没有显示任何内容。第二次,它显示它所在的
数据.table
/
数据.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)

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

如果(TRUE)DT[,LHS:=RHS]不再打印,#869和#1122。增加了测试。为了实现这一点,我们不得不面对一个缺点:如果在函数结束之前没有DT[]的函数中使用a:=,那么下次在提示符处键入DT或print(DT)时,将不会打印任何内容。将打印重复的DT或打印(DT)。为了避免这种情况:在函数的最后一个:=后面包含一个DT[]。如果这是不可能的(例如,它不是一个可以更改的函数),则提示处的DT[]保证打印。和以前一样,建议在:=查询的末尾添加一个额外的[]来更新然后打印;e、 g.>DT[,foo:=3L][]。感谢Jureis和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
库(magrittr)
库(数据表)
多年电价%
提取(值>0)%>%
提取(,值:=NULL)%>%`[`
##之后,这将第一次打印
临时雇员

我在RStudio和Rterm(R版本3.2.2(2015-08-14);平台:x86_64-w64-mingw32/x64(64位);data.table_1.9.6)中也看到了这一点。
print.data.frame(temp)
首先工作。我总是在
set()之后注意到这一点
调用
data.table
我肯定我以前见过data.table出现这种已知行为。在某个地方有一个重复的,可能其中一个data.table专家会知道它在哪里。搜索?或
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