如何在 rstudio 中使用 stargazer 修复“if (nchar(text.matrix[r, c]) > max.length[real.c]) { : 需要 TRUE/FALSE 的缺失值”中的错误?

Jon*_*ley 12 r stargazer

我正在尝试使用 Stargazer 在 Rstudio 中打印组合 lm 表,但我不断收到此消息:

if (nchar(text.matrix[r, c]) > max.length[real.c]) { 中的错误:需要 TRUE/FALSE 的缺失值

这是我正在使用的代码:

stargazer(lm_1, lm_2, lm_3, lm_4, 
          dep.var.labels =  c("PolOri_Social_std", "Sexual_Disgust_std"), 
          covariate.labels = c("Gender", "Sexual_Disgust_std"), 
          style = "demography", 
          out = "hierarchical.htm",
          header = F)
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个?

小智 8

问题似乎与在协变量名称中使用下划线有关。从它们中取出这些,它应该可以工作。


Oma*_*sow 7

正如其他人指出的那样,问题是由 covariate.labels 参数中的特殊字符引起的。然而,推荐的解决方案忽略了一些事情:

  1. 使用 Latex 输出,您可以使用\\“转义”特殊字符,以便它们正确显示。您还可以使用该命令xtable::sanitize("Sexual_Disgust_std", type = "latex")将字符串转换为对乳胶更友好的字符串。在原来的例子中,这将是:
`covariate.labels = c("Gender", "Sexual\\_Disgust\\_std")`
Run Code Online (Sandbox Code Playgroud)
  1. 对于 Latex 输出,一些特殊字符是数学字符,需要将它们包含在数学模式语法中。例如,如果两个协变量分别为 % Black 和 (% Black) 平方,则可以写为:
`covariate.labels = c("\\% Black", "(\\% Black)$^2$")`
Run Code Online (Sandbox Code Playgroud)
  1. 最初的问题似乎是写入.htm文件,但未在 stargazer 中指定type = 'html',因此默认值为type = 'latex'. 如果在 Latex 和 html 输出之间切换,某些 Latex 编码可能会破坏 html 生成。我不知道这个问题有什么优雅的解决方案,但如果您使用knitrR Markdown 或 Sweave,您可以使用以下函数:knitr:: is_latex_output()knitr::is_html_output()生成适当的 Latex 或 html 代码,如下所示:
    library(knitr)
    library(dplyr)
    library(stargazer)
        
    star_format <- dplyr::case_when(
        knitr::is_latex_output() ~ "latex",
        knitr::is_html_output()  ~ "html",
        TRUE                     ~ "text" # for interactive coding in console
    )
    
    # One way would be to build latex / html specific labels
    covar_labels <- dplyr::case_when(
        knitr::is_latex_output() ~ c("Gender", "Sexual\\_Disgust\\_std"),
        knitr::is_html_output()  ~ c("Gender", "Sexual Disgust std"),
        TRUE                     ~ c("Gender", "Sexual Disgust std")
    )

    # for simplicity, stargazer call doesn't include custom dep.var.labels or out arguments      
    stargazer(lm_1, lm_2, lm_3, lm_4, 
          type = star_format,
          covariate.labels = covar_labels)
    
    
    # A second way would be to create separate stargazer calls:
    if(knitr::is_html_output()) {
    stargazer(lm_1, lm_2, lm_3, lm_4, 
          type             = star_format,
          dep.var.labels   = c("PolOri Social std", "Sexual Disgust std"), 
          covariate.labels = c("Gender", "Sexual Disgust std"), 
          style            = "demography", 
          out              = "hierarchical.html",
          header           = FALSE)
    }
    
    if(knitr::is_latex_output()) {
    stargazer(lm_1, lm_2, lm_3, lm_4, 
          type             = star_format,
          dep.var.labels   = c("PolOri\\_Social\\_std", "Sexual\\_Disgust\\_std"), 
          covariate.labels = c("Gender", "Sexual\\_Disgust\\_std"), 
          style            = "demography", 
          out              = "hierarchical.tex",
          header           = FALSE)
    }
Run Code Online (Sandbox Code Playgroud)
  1. 使用相同的knitr::is_latex_output()knitr::is_html_output()函数,还可以使用正则表达式预处理任何标签,以专门格式化为 html 或 Latex 输出。例如,下面是一个小函数,可以搜索和替换各种特殊字符文本字符串。
    library(stringr)

    remove_special_chars <- function(covar_labels){
        covar_labels %>% 
            str_replace_all("\\\\", "") %>% 
            str_replace_all("\\^",  "") %>%
            str_replace_all("_",   " ") %>% 
            str_replace_all("\\$",  "") %>% 
            str_replace_all("`",   "'") 
    }
Run Code Online (Sandbox Code Playgroud)