knitr :: kable在运行R chunk后不会打印出来

时间:2017-08-25 15:07:15

标签: r rstudio knitr r-markdown

我注意到kable这种奇怪的行为 - 漂亮的打印在运行一块后消失了。

> 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  |

现在做文件>新文件> R笔记本。这将创建一个演示笔记本,其中包含一个包含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 个答案:

答案 0 :(得分: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函数时不是在笔记本电脑中,但我认为这不是一个重要的优先事项:如果你正在运行笔记本电脑,为什么你会关心你在控制台看到的内容?