为什么RMarkdown` render`行为取决于它是从RStudio Server还是从PHP shell调用的?

时间:2016-10-25 17:14:40

标签: r rstudio knitr r-markdown

我有一个包含“特殊字符”的RMarkdown文档,例如ë。如果我使用RStudio Server的“编织文档”按钮渲染文档,它会渲染得很好。当我通过使用RStudio Server按钮来渲染另一个调用RMarkdown的{​​{1}}函数的R脚本来渲染它时,它也会渲染得很好。

然而,由于某种原因超出了我(但希望不会长久),当render使用以下内容调用相同的R脚本时,我会得到不同的结果:

index.php

当我这样做时,在生成的.html文件中,特殊符号(我猜unicode符号)被$results = shell_exec("R --file='/home/username/public_html/some/subdirectories/process.R' --no-save 2>&1"); 替换。我试图查看这是否是某种我尚未了解的HTML元素变体,但我一直无法找到任何相关内容。

(注意:任何指向我可以了解更多相关信息的地方的链接(而且,当我们看到它时,为什么我的浏览器不显示它,例如,它代表的ë,也非常感谢!)

可再现的示例

<U+00EB>的内容:

example.php

<?php shell_exec("R --file='/home/username/public_html/subdirectory/example.R' --no-save 2>&1"); ?> 的内容(这是我在服务器上需要的内容):

example.R

workingPath <- "/home/username/public_html/subdirectory"; ### Set path to RStudio's pandoc version Sys.setenv(PATH=paste(Sys.getenv("PATH"), "/usr/lib/rstudio-server/bin/pandoc", sep=":")); ### Set HOME and LANG Sys.setenv(HOME = '/home/username'); Sys.setenv(LANG = 'en_US.UTF-8'); require(rmarkdown); renderResults <- render(file.path(workingPath, 'example.Rmd'), output_file = file.path(workingPath, 'example.html'), intermediates_dir = file.path(workingPath, 'tmp'), encoding="UTF-8"); 的内容:

example.Rmd

此示例的结果:

当我从R Studio运行时,我得到:

  

cat(“这是一个符号。”);

     

##这是一个ë符号。

当我从PHP运行时,我得到:

  

cat(“这是一个符号。”);

     

##这是&lt; U + 00EB&gt;符号

(请注意,有趣的是,--- title: 'Reproducable example' output: html_document --- ```{r} cat("This is an ë symbol."); ``` 'edë确实正常出现......)

我现在在echo文件中使用了str_replace,但这并不理想。

我已经检查了index.php手册,但我找不到任何有关此行为的信息。

我还看过在.Rmd文件的YAML标题中指定render的选项,但似乎唯一接近的是--ascii option,这不是任何东西。 R Studio RMarkdown page也没有提供任何提示。

它可能与RStudio中设置的环境变量有关吗?我已经不得不设置:

pandoc
在R脚本中,在从PHP shell调用的R脚本中调用时,首先让Pandoc进入;但如果这是问题,我如何确定RStudio设置哪些设置值,或者更准确地说,哪些设置重要?我跑了:

Sys.setenv(HOME = '/home/oupsyusr');
Sys.setenv(LANG = 'en_US.UTF-8');

从R Studio中,显示了相当多的列表。我认为没有任何条目与编码等有关。

或者,knitr会导致这个吗?当我存储并检查.md文件时,Unicode元素已经显示出来了。但是,knitr help page with chunk options一般没有说明unicode或编码。

有人知道记录在哪里,或者有人碰巧遇到过这种情况吗?

我在CentOS 6.8上运行RStudio 0.99.903和R 3.3.1。

1 个答案:

答案 0 :(得分:5)

通常,此形式的问题(其中unicode字符转换为unicode代码点表示,在本例中为<U+00EB>)是由尝试在非UTF-8语言环境中运行R引起的。 / p>

通常,可以通过检查Sys.getlocale("LC_ALL")的输出来验证这一点。如果您看到报告了C语言环境,那么您可能需要使用以下内容强制执行UTF-8语言环境:

Sys.setlocale("LC_ALL", "en_US.UTF-8")

根据您所需的语言替换特定的UTF-8语言环境。 (作为参考,通常可以使用类似locale -a)的终端查询可用语言环境集。