如何使用rstudio中的stargazer解决“Error in if (nchar(text.matrix [r,c])> max.length [real.c]) {:missing value where TRUE / FALSE needed”问题?

17

我正在使用Stargazer在Rstudio中尝试打印组合lm的表格,但一直收到以下错误信息:

Error in if (nchar(text.matrix[r, c]) > max.length[real.c]) { : missing value where TRUE/FALSE needed

这是我正在使用的代码:

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)

有人之前遇到过这个问题吗?


3
我遇到了同样的错误。看起来这是与“covariate.labels”参数相关的一个bug。如果你删除covariate.labels参数,表格就会打印出来(显然没有重命名的协变量标签)。 - Phil
3个回答

16

问题似乎与在协变量名称中使用下划线有关。将其删除后,应该可以解决问题。


1
它也可能是由符号“^”引起的。 - Marco
1
当回归方程中出现换行符(将记录为\n)时,会出现相同的问题。 - Jakob

7

正如其他人所指出的那样,问题出在covariate.labels参数中的特殊字符。然而,推荐的解决方案遗漏了一些内容:

  1. 对于LaTeX输出,您可以使用\\来“转义”特殊字符,以便它们正确显示。您还可以使用命令xtable::sanitize("Sexual_Disgust_std", type = "latex")将字符串转换为更符合LaTeX的格式。在原始示例中,应该这样做:
`covariate.labels = c("Gender", "Sexual\\_Disgust\\_std")`
  1. 使用LaTeX输出时,一些特殊字符是数学符号,需要用数学模式语法括起来。比如,如果有两个协变量分别为%黑人和(%黑人)的平方,可以这样写:
`covariate.labels = c("\\% Black", "(\\% Black)$^2$")`
  1. 原始问题似乎是要写入一个.htm文件,但没有在stargazer中指定type='html',因此默认值将为type='latex'。如果在latex和html输出之间切换,一些latex编码可能会破坏html生成。我不知道解决这个问题的优雅方法,但如果您正在使用R Markdown或Sweave的knitr,您可以使用函数: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)
    }
  • 使用相同的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("`",   "'") 
        }
    

    1

    出现错误的原因是在Latex中需要转义下划线(_),这会让stargazer混淆(即使你打印文本或HTML)。

    对我来说,最简单的解决方案是手动从标签中删除有问题的字符,并将它们传递给dep.var.labelscovariate.labels

    stargazer(lm_1, lm_2, lm_3, lm_4, 
              dep.var.labels = c("PolOri Social std", "Sexual Disgust std"), # Took out _'s
              covariate.labels = c("Gender", "Sexual Disgust std"))          # Took out _'s
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接