2017-08-25 117 views
1

我注意到kable這種奇怪的行爲 - 漂亮的打印在運行塊後消失。knitr :: kable在運行R塊後打印效果不佳

> knitr::kable(head(iris, 3)) 


| Sepal.Length| Sepal.Width| Petal.Length| Petal.Width|Species | 
|------------:|-----------:|------------:|-----------:|:-------| 
|   5.1|   3.5|   1.4|   0.2|setosa | 
|   4.9|   3.0|   1.4|   0.2|setosa | 
|   4.7|   3.2|   1.3|   0.2|setosa | 

現在請做File> New File> R Notebook。這創建了一個演示筆記本,其中包含plot(cars)的單個塊。執行筆記本中的該塊

> plot(cars) 

然後再次打印表格。這次輸出看起來不一樣。爲什麼?

> knitr::kable(head(iris, 3)) 
[1] "| Sepal.Length| Sepal.Width| Petal.Length| Petal.Width|Species |" 
[2] "|------------:|-----------:|------------:|-----------:|:-------|" 
[3] "|   5.1|   3.5|   1.4|   0.2|setosa |" 
[4] "|   4.9|   3.0|   1.4|   0.2|setosa |" 
[5] "|   4.7|   3.2|   1.3|   0.2|setosa |" 
attr(,"format") 
[1] "markdown" 
attr(,"class") 
[1] "knit_asis" 
attr(,"knit_cacheable") 
[1] NA 



> packageVersion("knitr") 
[1] ‘1.17’ 


> sessionInfo() 
R version 3.3.3 (2017-03-06) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X El Capitan 10.11.6 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.3.3 highr_0.6 knitr_1.17 


> RStudio.Version() 
$citation 

To cite RStudio in publications use: 

    RStudio Team (2016). RStudio: Integrated Development for R. RStudio, 
    Inc., Boston, MA URL http://www.rstudio.com/. 

A BibTeX entry for LaTeX users is 

    @Manual{, 
    title = {RStudio: Integrated Development Environment for R}, 
    author = {{RStudio Team}}, 
    organization = {RStudio, Inc.}, 
    address = {Boston, MA}, 
    year = {2016}, 
    url = {http://www.rstudio.com/}, 
    } 


$mode 
[1] "desktop" 

$version 
[1] ‘1.0.153’ 

回答

1

當您運行塊時,tools:rstudio環境的搜索列表上改變添加一個名爲print.knitr_kable函數,它是從knitr封裝內部的不同。

這是我之前看到:

> ls("tools:rstudio") 
[1] "debugSource"    "knit_with_parameters"  
[3] "registerShinyDebugHook" "RStudio.Version"   
[5] "rstudioDiagnosticsReport" "RStudioGD"    
[7] "source.with.encoding" 

和這裏就是我看到之後:

> ls("tools:rstudio") 
[1] "debugSource"     "dplyr_tibble_print_original" 
[3] "knit_with_parameters"  "print.knitr_kable"   
[5] "registerShinyDebugHook"  "RStudio.Version"    
[7] "rstudioDiagnosticsReport" "RStudioGD"     
[9] "source.with.encoding" 

無論出於何種原因,tools:rstudio功能被執行,而不是原來的一個。我可以通過運行detach("tools:rstudio")來恢復原始行爲,但是這會以多種方式混淆Rstudio,所以我不推薦它。一個不太極端的說法是

e <- as.environment("tools:rstudio") 
e$print.knitr_kable <- knitr:::print.knitr_kable 

但不會持續:RStudio明顯修復它只要您運行在筆記本一大塊。您也可以在每次打印時進行明確的呼叫,例如,

knitr:::print.knitr_kable(knitr::kable(head(iris, 3))) 

也許是最好的解決方案是爲knitr改變它確實是這樣RStudio想要的東西在RStudio筆記本電腦和漂亮的印刷運行,否則當,或RStudio改變運行knitr功能時,它不是在筆記本,但我想這不是一個重要的優先事項:如果你正在運行一個筆記本,爲什麼你會關心你在控制檯中看到的內容?

+0

謝謝! knitr ::: print.knitr_kable是一個合理的解決方案。關於爲什麼我會關心:kable對漂亮的打印數據幀非常有用。一個典型的用例:通過Slack與同事分享結果。另外,運行一個塊有點令人沮喪可以通過這種方式改變狀態。 – Shantanu

+0

我已經看了更多,這看起來像RStudio代碼中的錯誤。我會提交一個拉取請求來解決它。 – user2554330

+0

謝謝你的注意!我會繼續接受這個答案。 – Shantanu