【问题标题】:Lapply function to list of data.tables by reference silently通过静默引用将函数应用于 data.tables 列表
【发布时间】:2020-05-08 00:21:47
【问题描述】:

我有一个 data.tables 列表,我想对每个 data.table 应用一个函数。我设置为在 lapply 函数中使用:=。一切正常,我的输出通过引用更新,但我的函数也打印到控制台。这是一个更大项目的一部分,将此步骤打印到控制台并不理想。

如何在不打印的情况下“静默”运行?有没有更好的方法来构建工作流/代码?

dt1 <- data.table(a = rnorm(1:10),
           b = rnorm(1:10))

dt2 <- data.table(a = rnorm(1:10),
                  b = rnorm(1:10))

dts <- list(dt1, dt2)

lapply(dts, function(dt) {
  dt[, ':=' (c = a + b)]
})

dts

dts 现在有一个 C 列,但输出显示在控制台中。此代码块是从另一个函数调用的。

【问题讨论】:

  • 如果您想静默执行此操作,请使用walk
  • 你能把&lt;-分配给dts还是用invisible()包裹起来?
  • @Matt 是的,分配它可以抑制输出。我避免使用&lt;-,因为评估代码不需要它,但确实达到了预期的结果。
  • @akrun 我的意思是静默运行,因为 in 不会打印到控制台。我没有明确询问如何在不分配变量的情况下执行此操作,我只是没有设置我的代码来执行此操作。
  • 感谢您的回复。只是想消除这个疑问。

标签: r data.table lapply


【解决方案1】:

你可以使用 for 循环

for(dt in dts) dt[, ':='(c = a + b)]

【讨论】:

  • 这也是一个好方法。我很少再使用for 循环了,但有时它们是解决问题的最直接的方法。
【解决方案2】:

您可以分配lapply 调用,这将抑制输出

dts <- lapply(dts, function(dt) {
  dt[, ':=' (c = a + b)]
})

【讨论】:

  • 我认为这是最直接的解决方案。尽管我没有对此进行广泛测试,但似乎没有任何性能差异。谢谢
【解决方案3】:

我们。可以使用walk,它不会在控制台中打印任何内容

library(purrr)
walk(dts, ~ .x[, `:=`(c = a + b)])
dts
#[[1]]
#             a          b            c
# 1: -0.1069952  0.1115983  0.004603111
# 2:  0.3228771 -0.8400846 -0.517207530
# 3: -1.6072728 -0.2727947 -1.880067477
# 4:  0.1715614 -0.3864995 -0.214938065
# 5:  1.8233350 -1.0786569  0.744678084
# 6:  0.2366026 -0.6166318 -0.380029253
# 7:  0.2373992  0.2251559  0.462555116
# 8: -0.1075611 -1.0418174 -1.149378504
# 9:  1.6742520 -0.5635583  1.110693774
#10:  2.4733842  2.1091365  4.582520731

#[[2]]
#             a           b           c
# 1: -0.8332617  1.67201117  0.83874947
# 2:  1.3688393  1.12168046  2.49051974
# 3:  1.0208642 -1.18482073 -0.16395650
# 4:  0.6784662  2.15979872  2.83826493
# 5: -0.4351644 -0.04629453 -0.48145894
# 6:  1.3133550 -1.03423308  0.27912197
# 7:  1.0143396 -0.84787780  0.16646185
# 8: -0.9622108  0.92338456 -0.03882627
# 9: -0.3106202  1.08886031  0.77824008
#10:  0.7602507 -0.08996701  0.67028370

或者用invisiblelapply包装

invisible(lapply(dts, function(dt) {
                  dt[, ':=' (c = a + b)]
     }))

【讨论】:

  • 我想避免使用解决方案的额外包
  • @Mxblsdl 我还提供了一个base R 解决方案
【解决方案4】:

使用集合:

for (i in seq_along(dts)) set(dts[[i]], j = "c", value = dts[[i]]$a + dts[[i]]$b)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多