这与data.table objects not printed after returned from function有关,但不是欺骗。这个问题是专门寻找一种在repl上使用赋值:=
data.table行时不抑制输出的方法。因此,在eval会导致R调用print方法的情况下。
我已升级并注意到:=
现在无形地返回。当我使用交互式工作流程开发时,这会在构建管道时中断流程,添加分配:=
行,然后期望看到结果用作添加附加步骤的上下文。
当然我可以将[]
添加到赋值行,但这是在意识到我的赋值行没有打印之后(因为我之前没有这样做),所以我的流程在之前被中断了添加这个。或者,有人可能会争辩说我应该始终使用每个赋值行来[]
,以便我的流程不会中断,但是我必须记住只为分配行执行此操作,并且因为管道通常混合赋值使用过滤器,实际上这会引入额外的认知开销 - 对最终用户来说 - 感觉不必要,并且在管道中逐行进行时看起来不一致。
我宁愿不争论选择无形返回,因为我认为已经对此进行了彻底的讨论,并且已经为大多数人和用例做出了正确的决定。相反,我可以设置或解决方法让:=
无法无形返回吗?
答案 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
>