这里发生了一些非常奇怪的事情。在下面的代码中,我创建了一个名为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
...
...
这是为消除更大的错误而实施的修复程序的已知副作用。这里记录了它,作为v1.9.6版本"BUG修复"部分的第一项。引用该链接:
如果(TRUE)DT[,LHS:=RHS]不再打印,#869和#1122。已添加测试。为了实现这一点,我们不得不面对一个缺点:如果在函数结束前没有DT[]的函数中使用了一个:=,那么下次在提示符下键入DT或print(DT)时,将不会打印任何内容。将打印重复的DT或打印(DT)。为了避免这种情况:在函数中的最后一个:=后面包含一个DT[]。如果这是不可能的(例如,这不是一个您可以更改的函数),则DT[]在提示下保证打印。和以前一样,在:=查询的末尾添加一个额外的[]是建议更新然后打印的习惯用法;例如>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