r-在求值之前必须调用变量两次



这里发生了一些非常奇怪的事情。在下面的代码中,我创建了一个名为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

相关内容

  • 没有找到相关文章

最新更新