Как я могу удалить префикс (индексный указатель) [1] в выводе knitr? - программирование
Подтвердить что ты не робот

Как я могу удалить префикс (индексный указатель) [1] в выводе knitr?

Выход стандартного R выглядит следующим образом

> 3
[1] 3

Чтобы удалить префикс 1, вы можете использовать

> cat(3)
3

Есть ли способ удалить это глобально? Или вам нужно обернуть cat() вокруг всего?

Кроме того, я использую это внутри knitr, поэтому, если не существует глобальной настройки R, может быть широкая настройка knitr, я действительно смотрел, но не мог ее увидеть.

Изменить: спросили, почему это нужно, например, если вы хотите структурировать отчет, как показано ниже. [1] просто не нужен и ничего не значит для всех пользователей R (ака, аудитория).

enter image description here

Дополнительная информация: В knitr вы можете использовать \Sexpr {} или r ... для оценки чего-то в строке, и в этом случае он не печатает [1]. Например, если у вас есть:

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

Вы получите:

Есть 7 автомобилей с 6 цилиндрами.

Как ваш вывод, а не:

Есть [1] 7 автомобилей с 6 цилиндрами.

4b9b3361

Ответ 1

Нет ничего невозможного. Посмотрите, что можно сделать с помощью крюков для ножей.
Получайте удовольствие!
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))

Normal:

```{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]

Ответ 2

Невозможно выполнить. Но я бы смутился либо сделать это, либо просто обернуть все в cat. Почему?

Во-первых, пользователи R ожидают увидеть метку [1], и ее полезно, когда вектор длиннее одной строки, или если его матрица со строками и столбцами. Почему вы хотите это сделать?

Во-вторых, теперь вы знаете , почему, что вы хотите это сделать, напишите функцию с именем по причине, по которой вы хотите это сделать, и сделайте это, и заверните свои выходы в эту функцию. Потому что я считаю, что если вы хотите получить прекрасный контроль над выходом, вы довольно скоро собираетесь "Хммм cat не совсем режет это для меня, я хочу изменить это и то, и то-то и то", и это проще, если у вас есть завернул ваш выход в функцию, которую вы можете изменить. Сначала это может быть только cleanprint=function(...){cat(...)}, но затем легче перейти оттуда путем переопределения cleanprint, чем настройка cat. Возможно, вы захотите использовать sprintf или установить количество десятичных цифр или что-то еще.