在以下情况之后禁止输出的选项:= data.table中的赋值

时间:2016-09-20 21:01:55

标签: r data.table

这与data.table objects not printed after returned from function有关,但不是欺骗。这个问题是专门寻找一种在repl上使用赋值:= data.table行时不抑制输出的方法。因此,在eval会导致R调用print方法的情况下。

我已升级并注意到:=现在无形地返回。当我使用交互式工作流程开发时,这会在构建管道时中断流程,添加分配:=行,然后期望看到结果用作添加附加步骤的上下文。

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

我宁愿不争论选择无形返回,因为我认为已经对此进行了彻底的讨论,并且已经为大多数人和用例做出了正确的决定。相反,我可以设置或解决方法让:=无法无形返回吗?

1 个答案:

答案 0 :(得分:1)

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
>