【问题标题】:Conditional colouring with kableExtra() fails with NAs in column使用 kableExtra() 进行条件着色失败,列中有 NA
【发布时间】:2019-02-04 16:03:23
【问题描述】:

我使用 kableExtra() 包对 PDF 输出 Rmarkdown 报告中的表格进行条件格式设置。一切都很好,但如果在一列中存在 NA 则会失败。

原始报告包含在特定变量上具有百分比一致性的列(例如 21%(但 % 不在单元格中)),但是如果该值基于少于 10 个答案以保护受试者答案,它将显示 NA,因此,我将在表中列出潜在的 NA。

这里是一个小例子,它适用于一个案例(没有 NA):

---
output: pdf_document
---

```{r setup}
knitr::opts_chunk$set(echo = TRUE)
# load packages
library(tidyverse)
library(kableExtra)


# example when no NA are resent
df1 <- mtcars %>% select(mpg, cyl, disp)
df1 <- head(df1, 10)
# kable
df1 %>%
  mutate(cyl = cell_spec(cyl, color = if_else(cyl == 8, "teal",
                                              if_else(cyl == 6, "orange", 
                                                      if_else(is.na(cyl), "black", "red"))))) %>%
    kable("latex", escape = F, booktabs = TRUE, linesep = "")

```

这是另一个,当存在 NA 时:

```{r, eval=T}
# example when NA is present
df2 <- mtcars %>% select(mpg, cyl, disp)
df2 <- head(df2, 10)
df2$cyl[df2$cyl == 4] <- NA

# kable
df2 %>%
  mutate(cyl = cell_spec(cyl, color = if_else(cyl == 8, "teal",
                                              if_else(cyl == 6, "orange", "red")))) %>%
    kable("latex", escape = F, booktabs = TRUE, linesep = "")


```

运行块的错误是:

Error in if (substr(color, 1, 1) != "#") { : missing value where 
TRUE/FALSE needed

编织时的错误是:

我还尝试添加第三个 if_else() 评估为 is.na() - 错误保持不变:

# kable
df2 %>%
  mutate(cyl = cell_spec(cyl, color = if_else(cyl == 8, "teal",
                                              if_else(cyl == 6, "orange", 
                                                      if_else(is.na(cyl), "black","red"))))) %>%
    kable("latex", escape = F, booktabs = TRUE, linesep = "")

我的会话信息:

R version 3.5.2 (2018-12-20)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.2

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

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     

other attached packages:
 [1] naniar_0.4.1       shurp2018_0.0.9000 kableExtra_1.0.1   forcats_0.3.0      stringr_1.3.1      dplyr_0.8.0        purrr_0.3.0       
 [8] readr_1.3.1        tidyr_0.8.2        tibble_2.0.99.9000 ggplot2_3.1.0      tidyverse_1.2.1 

【问题讨论】:

    标签: r r-markdown kableextra


    【解决方案1】:

    看来你有两个问题:

    首先,我认为默认情况下,没有设置颜色值。然而,对于某些单元格color = NA,它也不会被覆盖。所以你可以通过设置color = NULL 来解决它(任何其他颜色都会与下一步分配的颜色连接,这会导致麻烦)。所以这对我来说有点作用:

    ```{r}
    # kable
    df2 %>%
      mutate(cyl = cell_spec(cyl, color = NULL)) %>% 
      mutate(cyl = cell_spec(cyl, color = if_else(cyl == 8, "teal",
                                                  if_else(cyl == 6, "orange", "red")))) %>%
        kable("latex", escape = F, booktabs = TRUE, linesep = "")
    ```
    

    问题是NA 的颜色现在是红色而不是黑色。

    第二个问题是您的ifelse 评估无法正常工作

    您还可以单独检查ifelse 函数中发生的情况,以更好地了解此问题:

    > with(df2,  if_else(cyl == 8, "teal",
    +                    if_else(cyl == 6, "orange", 
    +                            if_else(is.na(cyl), "black","red"))))
     [1] "orange" "orange" NA       "orange" "teal"   "orange" "teal"   NA       NA       "orange"
    

    但是您可以通过首先评估 is.na(cyl) 而不是最后一个来使其工作:

    df2 %>%
      mutate(cyl = cell_spec(cyl, color = if_else(is.na(cyl), "black", 
                                                  if_else(cyl == 8, "teal",
                                                          if_else(cyl == 6, "orange", "red"))))) %>%
      kable("latex", escape = F, booktabs = TRUE, linesep = "")
    

    【讨论】:

    • 太棒了,第二个选项将is.na(cyl) 放在第一个作品中 - 现在我还有一个问题:我在文档的开头设置了options(knitr.kable.NA = '-'),但现在我得到了“NA” -我认为它是因为 kable 不会将 \textcolor{"black"}{NA} 评估为 "NA" 而是作为文本...?
    • 嗯可能是。我知道knitr 还支持通过knit_hooks$set(document = function(x) { gsub('\textcolor{"black"}{NA} ', '\textcolor{"black"}{-}', x, fixed = TRUE) }) 更改生成的乳胶文件。也许这会有所帮助。
    • 不需要挂钩。只需通过管道输入gsub("NA", "-", .)。原因是cell_spec 显然在单元格内添加了乳胶代码,因此它不再是NAkable 无法识别它。
    • 为了完整起见:我尝试了 @JBGruber 的钩子 - 但我无法让它工作,但 Martin Schmelzer 在 kable() 末尾的代码工作 - 谢谢
    • 是的,我没有测试钩子。在我的另一个文档中它可以工作,但在这种情况下,document 可能不是正确的钩子?无论如何,如果其他建议有效,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多