为什么在j中调用hist时会打印直方图对象?

时间:2015-12-17 19:22:16

标签: r data.table

set.seed(120834)
DT <- data.table(var = rnorm(100))

比较

> hist(DT[ , var]) #of course plot is drawn

使用

> DT[ , hist(var)]
$breaks
 [1] -3.0 -2.5 -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0  2.5

$counts
 [1]  1  1  6  7 16 20 20 12 12  3  2

$density
 [1] 0.02 0.02 0.12 0.14 0.32 0.40 0.40 0.24 0.24 0.06 0.04

$mids
 [1] -2.75 -2.25 -1.75 -1.25 -0.75 -0.25  0.25  0.75  1.25  1.75  2.25

$xname
[1] "var"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

为什么后者打印hist返回的对象,而不是前者?有没有办法压制这个?

我在hist.default的代码中看到该对象被无形地返回:

if (plot) {
        plot(r, freq = freq1, col = col, border = border, angle = angle, 
            density = density, main = main, xlim = xlim, ylim = ylim, 
            xlab = xlab, ylab = ylab, axes = axes, labels = labels, 
            ...)
        invisible(r)
    }

(并查看来自DT[ , hist(var, NA)]确认[.data.table的错误确实正在调用hist.default

那么[.data.table如何设法取代这个不可见的回复呼叫?也许是不可见的对象无形地返回到隐藏的环境中,但是那个环境中的对象会被明显地返回?

1 个答案:

答案 0 :(得分:1)

这是一个已知的错误,截至目前,还没有已知的解决方案或计划来修复它。

请参阅GH Issue #482了解更新。

从Matt编辑 - 解决方法

你可以这样压制它:

DT[ , {hist(var);NULL}]

invisible(DT[,hist(var)])

看起来我们需要重新审视这一点,因为常见问题解答2.18需要更新:“2.18我只使用j来解决它的副作用,但我仍然得到了返回的数据。如何阻止它?”我过去曾经尝试更好,花了好几天时间。我们在一定程度上受到R内部的限制(如FAQ 2.22所解释)