使用kableExtra()的条件着色在列中的NAs中失败

使用kableExtra()的条件着色在列中的NAs中失败,r,r-markdown,kableextra,R,R Markdown,Kableextra,我使用kableExtra()-包对PDF输出Rmarkdown报告中的表进行条件格式设置。所有这些都可以很好地工作,但如果在一列中有NA出现,则会失败 原始报告包含与特定变量百分比一致的列(例如,21%(但单元格中不包含%),但是如果该值基于受试者答案保护的少于10个答案,则该列将显示NA,因此表中有潜在的NAs 以下是一个小的reprex,用于一个案例(无NA): 编织时的错误是: 我还尝试添加第三个if_else(),其计算结果为is.na()-错误保持不变: # kable df2 %

我使用kableExtra()-包对PDF输出Rmarkdown报告中的表进行条件格式设置。所有这些都可以很好地工作,但如果在一列中有NA出现,则会失败

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

以下是一个小的reprex,用于一个案例(无NA):

编织时的错误是:

我还尝试添加第三个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 = "")
My session.info:

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 

看来你有两个问题:

首先,我认为默认情况下,没有设置颜色值。但是,对于某些单元格
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 = "")

很好,放置
的第二个选项是.na(cyl)
首先起作用-现在我有一个进一步的问题:我在文档的一开始就设置了
选项(knitr.kable.na='-')
,但是现在我得到了“na”-我假设它是因为kable不会将\textcolor{“black”}{na}计算为“na”,而是作为文本…?嗯,可能是这样。我知道
knitr
还支持通过以下方式更改生成的latex文件:
knit_hooks$set(document=function(x){gsub('\textcolor{“black”}{NA}','\textcolor{“black”}{-}',x,fixed=TRUE)}
。也许那会有帮助,不需要钩子。只需插入
gsub(“NA”,“-”,)
。原因是
cell\u spec
显然在单元格中添加了latex代码,因此它不再是
NA
,而且
kable
也无法识别它。为了完整性起见:我尝试了@JBGruber的钩子,但我没能让它工作,但是Martin Schmelzer在kable()末尾的代码工作了-谢谢,我没有测试钩子。在我的另一个文档中,它可以工作,但在这种情况下,
document
不是正确的钩子吗?不管怎样,如果另一个建议有效,那就太好了。
```{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 = "")
```
> 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"
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 = "")