2016-09-20 75 views
-2

这与data.table objects not printed after returned from function有关,但不是一个骗局。这个问题是专门寻找一种在repl上使用分配:= data.table行时不抑制输出的方法。所以在eval会导致R调用打印方法的情况下。一个选项不能抑制输出:=在data.table中赋值

我已经升级并注意到:=现在不可见。当我使用交互式工作流进行开发时,会在构建管道时中断流程,添加作业:=一行,然后期望看到结果用作上下文来添加额外步骤。

当然我可以将[]添加到赋值行,但是在意识到我的赋值行没有打印之后(因为我之前没有这样做),所以我的流程在添加之前就被打乱了。或者,有人可能会争辩说,我应该总是使用每个赋值行来处理[],这样我的流程就不会中断,但是我必须记住只为赋值行执行此操作,并且由于流水线通常会将分配与过滤器混合在一起实践中会引入额外的认知开销 - 对最终用户而言 - 感觉不必要,并且在流水线中逐行进行时看起来不一致。

我不想争论选择不可见或不可见的返回,因为我已经对此进行了充分讨论,并且已经为大多数人和用例做出了正确的决定。相反,是否有我可以设置的选项或解决方法使:=不可见?

+1

这是一个相关的讨论http://stackoverflow.com/questions/15267018/ knitr-gets-tricked-by-data-table-assignment –

+3

你升级了哪个版本? ':='现在已经无形地返回了很多*年*。最后加入'[]'是我知道的最简单的选项。 – eddi

+0

@ Eddie 1.9.6至1.9.6 :)。我还升级了R,vim,vim-r,tmux,并且我在一台新机器上。所以我以前的设置中的某些东西实际上允许这种行为在1.9.6中持续存在。我认为这是因为这是对data.table的改变,这个问题可能与其他“升级”的问题相关。与此同时,我正在系统地尝试查看我的设置中发生了什么变化,以便我可以将此用于解决方法的灵感。 –

回答

2

1.9.6中的一种方法是修补print.data.table S3方法。

在调用原始方法之前,将.global $ print值设置为“”(默认值)。这解除了在data.table想要不可见地返回(例如,赋值:=行)的情况下,在调用通用打印方法(使用动态作用域规则)之前,该值如何更改。

效果是仍然调用data.table的自定义打印方法,但data.table不再尝试修改R的默认逻辑以决定何时以及何时不打印。

可能是一个天真的解决方案,因为我还在学习包,命名空间,环境,S3方法等

library(data.table) 
print.data.table.orig = get('print.data.table', envir=asNamespace('data.table')) 
print.data.table.patch = function(x, ...) { 
    .globalRef = get('.global', envir=asNamespace('data.table')) 
    .globalRef$print = "" 
    print.data.table.orig(x, ...) 
} 

library(R.methodsS3) 
setMethodS3('print', 'data.table', print.data.table.patch) 


fTbl = data.table(x=1:500000) 
fTbl[, x := 5] 
     x 
    1: 5 
    2: 5 
    3: 5 
    4: 5 
    5: 5 
    --- 
499996: 5 
499997: 5 
499998: 5 
499999: 5 
500000: 5 

fTbl 
     x 
    1: 5 
    2: 5 
    3: 5 
    4: 5 
    5: 5 
    --- 
499996: 5 
499997: 5 
499998: 5 
499999: 5 
500000: 5 
>