gpt4 book ai didi

r - knitr:带有output.lines=选项的输出钩子(Hook),其工作方式类似于echo=2:6

转载 作者:行者123 更新时间:2023-12-02 14:11:29 25 4
gpt4 key购买 nike

在一个图书项目中,我有很多输出想要缩写,方法是仅选择行的子集,并添加 ... 以指示某些输出已被省略。例如,在 summary(lm()) 的输出中,我可能只想打印系数表,并使其显示如下:

 >summary(lm(Sepal.Length ~ Species, data=iris))
...
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.0060 0.0728 68.762 < 2e-16 ***
Speciesversicolor 0.9300 0.1030 9.033 8.77e-16 ***
Speciesvirginica 1.5820 0.1030 15.366 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
...

我编写了以下输出 Hook ,它与 block 选项 output.lines= 一起使用,并接受单个数字 n,表示仅打印行 1:n,有点像 head() 会做的:

  # get the default output hook
hook_output <- knit_hooks$get("output")

knit_hooks$set(output = function(x, options) {
lines <- options$output.lines
if (is.null(lines)) {
hook_output(x, options) # pass to default hook
}
else {
x <- unlist(stringr::str_split(x, "\n"))
if (length(x) > lines) {
# truncate the output, but add ....
x <- c(head(x, lines), "...\n")
}
# paste these lines together
x <- paste(x, collapse = "\n")
hook_output(x, options)
}
})

我试图将其概括为接受行号的(连续)向量,如下所示,但似乎并没有工作,我不知道为什么。它也不像我想要的那么通用,因为传递 output.lines=1:12 应该只打印第 1:12 行...,就像选项 echo=,最好使用 output.lines = -1:3 来获取 ... 后跟所有剩余的行。

  # knitr hook function to allow an output.lines option
# e.g.,
# output.lines=12 prints lines 1:12 ...
# output.lines=3:15 prints lines ... 3:15 ...

knit_hooks$set(output = function(x, options) {
lines <- options$output.lines
if (is.null(lines)) {
hook_output(x, options) # pass to default hook
}
else {
x <- unlist(stringr::str_split(x, "\n"))
more <- "...\n"
if (length(lines)==1) { # first n lines
if (length(x) > lines) {
# truncate the output, but add ....
x <- c(head(x, lines), more)
}
}
else {
x <- c(more, x[lines], more)
}
# paste these lines together
x <- paste(x, collapse = "\n")
hook_output(x, options)
}
})

我认为这是一个比我的问题更普遍的问题,所以也许这对 knitr 来说是一个受欢迎的补充。

-迈克尔

最佳答案

我也不明白为什么它不起作用。 ll指出了上面注释中的一个错误(-1:3应该是-(1:3)),这可能就是原因。除此之外,它对我来说效果很好:

```{r}
library(knitr)
hook_output <- knit_hooks$get("output")
knit_hooks$set(output = function(x, options) {
lines <- options$output.lines
if (is.null(lines)) {
return(hook_output(x, options)) # pass to default hook
}
x <- unlist(strsplit(x, "\n"))
more <- "..."
if (length(lines)==1) { # first n lines
if (length(x) > lines) {
# truncate the output, but add ....
x <- c(head(x, lines), more)
}
} else {
x <- c(more, x[lines], more)
}
# paste these lines together
x <- paste(c(x, ""), collapse = "\n")
hook_output(x, options)
})
```

Normal output.

```{r test}
summary(lm(Sepal.Length ~ Species, data=iris))
```

The first 4 lines.

```{r test, output.lines=4}
```

Remove the first 8 lines.

```{r test, output.lines=-(1:8)}
```

From 8 to 15.

```{r test, output.lines=8:15}
```

results after modifying the the output hook

关于r - knitr:带有output.lines=选项的输出钩子(Hook),其工作方式类似于echo=2:6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23114654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com