knitr — сводка странного поведения (числовая) выводит значения, отличные от str()

#knitr #numeric #summary

#knitr #числовая #Краткие сведения

Вопрос:

Я пытаюсь разработать воспроизводимый отчет об исследовании, который включает в себя распечатанный вывод переменных распределений входных наборов данных.

Меня смущает результат summary() в небольшом примере ниже. Когда я оцениваю код непосредственно на консоли, я получаю ‘b’ — это весь 2012 год, как и ожидалось, однако, когда я запускаю это с помощью knit2html(), он отображается как 2010.

 dat <- data.frame(a = letters, b = rep(2012, length(letters)))
str(dat)

## 'data.frame':    26 obs. of  2 variables:
##  $ a: Factor w/ 26 levels amp;quot;aamp;quot;,amp;quot;bamp;quot;,amp;quot;camp;quot;,amp;quot;damp;quot;,..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ b: num  2012 2012 2012 2012 2012 ...

dd <- lapply(dat, summary)
dd

## $a
## a b c d e f g h i j k l m n o p q r s t u v w x y z 
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
## 
## $b
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2010    2010    2010    2010    2010    2010

sessionInfo()

## R version 3.1.0 (2014-04-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C         LC_TIME=C           
##  [4] LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C       
##  [7] LC_PAPER=C           LC_NAME=C            LC_ADDRESS=C        
## [10] LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] knitr_1.5
## 
## loaded via a namespace (and not attached):
## [1] evaluate_0.5.1 formatR_0.9    stringr_0.6.2  tools_3.1.0
 

Ответ №1:

В фрагментах кода options("digits") knitr значение по умолчанию равно 4. summary Функция имеет digits аргумент, который по умолчанию max(3, getOption("digits")-3) равен (см. ?summary ). Это приводит summary к округлению 2012 года до трех значащих цифр, в результате чего получается 2010 год.

Вы можете либо увеличить этот digits параметр в своем фрагменте кода:

 options(digits=7)
 

Или укажите digits аргумент в вашем вызове summary :

 dd <- lapply(dat, summary, digits=4)
 

Комментарии:

1. спасибо, я хочу, чтобы это было общим, поэтому подумываю об использовании summary2 <- function(x){ summa <- summary(x, digits = nchar(max(x)) 3) return(summa) }