library(printr) 在 knit 到 html 时与 data.table 的“:=”交互?

问题描述 投票:0回答:1

我有一个在 rstudio 控制台中运行的 markdown 文件,但是当我尝试将其编织成 html 时,它会花费很长时间。我花了很长时间的尝试和错误才确定似乎包含“printr”库会触发 data.table 的 := 分配,通过尝试打印整个表(在我的情况下非常大)来挂起编织)。这是演示这一点的代码。这是 printr 的已知“功能”吗?值得指出的是,即使代码块是

results='hide'
include=FALSE
并且表格未在 html 中显示,包含 printr 的代码仍然运行得很慢。

library(data.table)
library(bit64)
library(printr) # printr will make data.table := to print out the data in knit?
#test_n = 4000000 # with 4000000 and printr included it will take forever
test_n = 4000

print("slow chunk start:")
print(Sys.time())
DT = data.table(a = as.integer(1:test_n),
                b = as.integer64(1:test_n),
                c = as.integer(1:test_n))
DT[, seq:=1:.N] # whole table will print if printr is included
print(DT[1:10])
print("slow chunk end:")
print(Sys.time())
r data.table r-markdown knitr
1个回答
0
投票

问题在于

data.table
包为 data.tables 定义了
print
方法,但没有定义
knit_print
方法,因此
knitr
使用
knit_print.data.frame
中定义的
printr
方法,它打印了整个内容。

有几个简单的解决方案。 @r2evans 建议使用

invisible()
,例如
invisible(DT[, seq:=1:.N])
。这会起作用,因为如果您要求
knitr
不这样做,它就不会尝试打印内容。

另一个简单的解决方案是提供您自己的

knit_print
不打印任何内容的方法,例如

knit_print.data.table <- function(x, ...) NULL

将其尽早放入文档中,您将永远不会打印 data.tables。如果您有时希望打印它们,您可以设置一个选项,例如

knit_print.data.table <- function(x, ...) {
  if (getOption("print.data.tables", FALSE)) # default to FALSE
    NextMethod()
}
 

默认情况下不会打印,但如果您希望打印,请运行

options(print.data.tables = TRUE)

事前(如果您只想发生一次,则事后将其设置为 FALSE)。

另一种未记录的方法是将方法设置为

knit_print.data.table <- function(x, ...) {
  if (data.table::shouldPrint(x)) 
    NextMethod()
}

shouldPrint
的文档表明这是正确的解决方案,但他们确实警告不要使用它。

© www.soinside.com 2019 - 2024. All rights reserved.