如何在knitr输出中删除前缀(索引指示符)[1]?

时间:2014-03-20 06:12:51

标签: r knitr

标准R输出如下所示

> 3
[1] 3

要删除前缀1,您可以使用

> cat(3)
3

有没有办法全局删除?或者你必须将cat()包裹在一切吗?

除此之外,我在knitr中使用了这个,所以如果没有R全局设置,可能会有一个knitr wide设置,我确实看了,但不能'看一个。

编辑:有人问为什么会想要这个,就像你想要构建如下的报告一样。 [1]只是不需要,对R用户(也就是观众)来说没有任何意义。

enter image description here

其他信息:在knitr中,您可以使用\ Sexpr {}或r ...来评估某些内容,在这种情况下,它不会打印[1]。例如,如果你有:

There are `r sum(mtcars$cyl==6)` cars with 6 cylinders.

你会得到:

有7辆汽车有6个汽缸。

作为输出,不是:

[1]辆汽车有6个汽缸。

2 个答案:

答案 0 :(得分:19)

没有什么是不可能的。看看knitr hooks可以做些什么 玩得开心!
Rmarkdown script gist

# A Prefix nulling hook.

# Make sure to keep the default for normal processing.
default_output_hook <- knitr::knit_hooks$get("output")

# Output hooks handle normal R console output.
knitr::knit_hooks$set( output = function(x, options) {

  comment <- knitr::opts_current$get("comment")
  if( is.na(comment) ) comment <- ""
  can_null <- grepl( paste0( comment, "\\s*\\[\\d?\\]" ),
                     x, perl = TRUE)
  do_null <- isTRUE( knitr::opts_current$get("null_prefix") )
  if( can_null && do_null ) {
    # By default R print output aligns at the right brace.
    align_index <- regexpr( "\\]", x )[1] - 1
    # Two cases: start or newline
    re <- paste0( "^.{", align_index, "}\\]")
    rep <- comment
    x <- gsub( re, rep,  x )
    re <- paste0( "\\\n.{", align_index, "}\\]")
    rep <- paste0( "\n", comment )
    x <- gsub( re, rep,  x )
  }

  default_output_hook( x, options )

})

knitr::opts_template$set("kill_prefix"=list(comment=NA, null_prefix=TRUE))

正常:

```{r}
print( 1:50 )
```
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
## [47] 47 48 49 50

空前缀

```{r, null_prefix=TRUE}
print( 1:50 )
```
##  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
## 47 48 49 50

设为默认值(并删除注释字符串):

```{r}
knitr::opts_chunk$set(opts.label="kill_prefix")
```

```{r}
print( 1:50 )
```
  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
 47 48 49 50

确保我们不会使用[:digit:]模式杀死字符串。


```{r}
print( paste0( paste0("[", 1:50), "]" ),quote = FALSE)
```
 [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]  [10] [11] [12] [13] [14]
 [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28]
 [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42]
 [43] [44] [45] [46] [47] [48] [49] [50]

答案 1 :(得分:1)

无法完成。但我会毫不犹豫地做到这一点,或者只是将所有内容都包裹在cat中。为什么呢?

首先,R用户希望看到[1]标签,当向量长于一行时,或者如果它是带行和列标签的矩阵,它会很有用。你为什么要这样做?

其次,现在您知道为什么要执行此操作,编写一个以您想要执行此操作的原因命名的函数,执行此操作,并将输出包装在该函数中。因为我认为如果你想要对输出进行精细控制,你很快就会去#34;嗯cat并没有为我完全切割它,我想改变这个以及那个以及那个和那个& #34;如果您将输出包装在可以更改的功能中,那就更容易了。起初它可能只是cleanprint=function(...){cat(...)}但是通过重新定义cleanprint比调整cat更容易从那里继续前进。您可能想要使用sprintf,或设置小数位数等。