【问题标题】:R: Encoding of labelled data and knit to html problemsR:标记数据的编码和编织到 html 的问题
【发布时间】:2017-12-14 18:49:00
【问题描述】:

首先,很抱歉没有提供可重现的示例并发布图片,最后解释一下我为什么这样做。

非常感谢一些帮助 - cmets 或其他方面,我想我已尽我所能做到具体和简洁

我要解决的问题是如何设置(以及在哪里进行)编码,以便在将.Rmd 文档编织到html 后获得波兰字母。

我正在处理通过haven 库导入到R 的标记spss 文件,并使用sjPlot 工具制作表格和图表。

我已经花了几乎一整天的时间试图解决这个问题,但我觉得我不知道该去哪里。

我的sessionInfo()

R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=Polish_Poland.1250  LC_CTYPE=Polish_Poland.1250    LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C                   LC_TIME=Polish_Poland.1250    

每当我运行时(通过控制台/脚本)

sjt.frq(df$sex, encoding = "Windows-1250")

我在 rstudio 查看器窗格中得到了一个带有正确编码的漂亮表格:

尝试不使用编码 sjt.frq(df$sex) 给出以下结果:

我可以忍受每次调用 sjt.frq 时设置编码,但问题是,无论我如何在 markdown 文档中设置 sjt.frq,它总是以错误的方式编织。

在 .Rmd 中运行块是可以的(出于完全未知的原因 encoding = "UTF-8 在这里也可以正常工作,而以前没有):

编织同一个文件,不行: (注意,html 标头包含所有波兰字符)

此外,它看起来可能是 htmlsjPlot 特定的,因为 knitr 可以在向量中打印波兰语字母,并像打印到控制台一样传递它们:

我可以设置/更改什么来完成这项工作吗?

在测试我发现的不同选项时,手动将 sex 变量转换为因子并再次分配标签,工作和 Rstudio 编织到 html 并使用正确的编码

df$sex <- factor(df$sex, label = c("kobieta", "mężczyzna"))
sjt.frq(df$sex, encoding = "Windows-1250")

关于没有可重复的例子:

我试图用假数据模拟这个例子:

# Get libraries
library(sjPlot)
library(sjlabelled)

x <- rep(1:4, 4)
x<- set_labels(x, labels = c("ąę", "ćŁ", "óŚŚ", "abcd"))

# Run freq table similar to df$sex above
sjt.frq(x)
sjt.frq(x, encoding = "UTF-8")
sjt.frq(x, encoding = "Windows-1250")

问题是,每个 sjt.frq 调用都按照应有的方式编织(尽管只有 encoding = "Windows-1250" 在 rstudio 查看器窗格中正确呈现。

【问题讨论】:

    标签: r encoding character-encoding knitr sjplot


    【解决方案1】:

    如果您运行sjt.frq(),则会返回一个完整的 HTML 页面,并显示在查看器中。

    但是,在 markdown/knitr-documents 中使用时,只需要部分 HTML 输出:例如,您不需要 &lt;head&gt; 部分,因为 knitr-document 会为HTML 页面。因此,knitr-documents 有一个自己的print()-method,它使用另一个返回值包含到 knitr-file 中。

    比较:

    dummy <- sjt.frq(df$sex, encoding = "Windows-1250")
    dummy$output.complete # used for default display in viewer
    dummy$knitr           # used in knitr-documents
    

    由于编码位于&lt;meta&gt;-tag 中,不包含在$knitr-value 中,所以sjt.frq() 中的encoding-argument 对knitr-documents 没有影响。

    认为这可能会对您有所帮助:rmarkdown::render_site(encoding = 'UTF-8')。也许还有其他选项可以对文本进行编码,或者您需要修改最终的 HTML 文件,在那里更改字符集编码。

    【讨论】:

    • 丹尼尔,感谢您的光临。我会在我排序 Error in rmarkdown::render_site(encoding = "UTF-8") : No site generator found. 时看看这是否有效
    • 将 .rmd 重命名为 index.Rmd 并添加 _site.yml 修复了上述错误,但是 - 设置 (encoding = "UTF-8") 并没有改变任何东西。我的报告看起来和以前一样 - sjt 对象编码不正确,而 sjp 对象编码正确
    • 我认为rmarkdown::render_site() 不会有帮助。它没有对字符编码做任何特别的事情(至少没有比rmarkdown::render() 更特别的了)。
    • 关键是dummy$knitr 到底是什么。它是一个简单的字符串吗?还是特殊类的对象?我相对肯定iconv() 调用与适当的fromto 可以解决问题,但我不知道$knitr 是什么,因为我不熟悉sjPlot。在 Windows 上,当您处理字符串时,最好使用的编码是原生编码(但并非所有字符都可以用原生编码表示),其次是 UTF-8。
    • 是的,$knitr 是一个带有 HTML 内容的简单字符串,可以包含在 knitr 文件中。有一个包小插图描述了表格输出函数的一些基础知识 (cran.r-project.org/web/packages/sjPlot/vignettes/sjtbasic.html)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2021-05-30
    • 2019-05-30
    • 2020-08-06
    • 2014-08-02
    相关资源
    最近更新 更多