【问题标题】:An option to not suppress output after := assignment in data.table在 data.table 中的 := 赋值后不抑制输出的选项
【发布时间】:2016-09-20 21:01:54
【问题描述】:

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

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

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

我宁愿不争论选择隐形返回,因为我认为这已经被彻底讨论过,并且已经为大多数人和用例做出了正确的决定。相反,有没有我可以设置的选项或解决方法让:= 不会隐形返回?

【问题讨论】:

  • 您是从哪个版本升级的? := 已经隐形回归很多年了。在末尾添加[] 是我所知道的最简单的选项。
  • @Eddie 1.9.6 到 1.9.6 :)。我还升级了 R、vim、vim-r、tmux,而且我在一台新机器上。因此,我之前的设置实际上允许这种行为在 1.9.6 中持续存在。我认为,由于这是对 data.table 所做的更改,因此该问题可能与“升级”的其他人有关。与此同时,我正在系统地尝试查看我的设置发生了什么变化,以便我可以从中获得灵感来解决问题。
  • 澄清@eddi 的评论,以防您不太明白。您无需使用[] 添加新行。您只需将其附加到相同的命令,如 dt[, col := x][]
  • 我认为您需要添加一个 MRE 来准确说明“扰乱流程”的含义。我发现很难理解使用 [] 会破坏哪些案例

标签: r data.table


【解决方案1】:

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

在调用原始方法之前,将 .global$print 值设置为“”(默认值)。在 data.table 想要不可见地返回的情况下(例如,赋值 := 行),这将撤消在调用通用 print 方法之前(使用动态范围规则)更改此值的方式。

效果是仍然调用了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
> 

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 2017-03-11
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2011-10-28
    • 2016-03-07
    相关资源
    最近更新 更多