2016-10-25 14 views
3

私はëのような「特殊文字」を含むRMarkdown文書を持っています。 RStudio Serverの "knit document"ボタンを使用してドキュメントをレンダリングすると、レンダリングがうまくいきます。 RStudio Serverボタンを使ってレンダリングすると、RMarkdownrender関数を呼び出す別のRスクリプトをソースにしても、それはうまく描画されます。その同じRスクリプトが呼び出されたときにRMarkdownの `render`動作は、RStudio Serverから呼び出されるのか、PHPシェルから呼び出されるのかによって異なります。

しかし、(長いため、できればないけど)私を超えますいくつかの理由から、私が使用してindex.phpによって異なる結果を得る:私はこれを行うと、得られる

$results = shell_exec("R --file='/home/username/public_html/some/subdirectories/process.R' --no-save 2>&1"); 

.htmlファイルでは、特別なシンボル(私はユニコードシンボルと思われる)は<U+00EB>に置き換えられます。私はこれがまだ知らないHTML要素のバリエーションであるかどうかを調べようとしましたが、これについて何も見つけることができませんでした。

(注:私がこれについてもっと学ぶことができる場所へのリンク(そして、私たちがそれをしている間、私のブラウザはそれが表示しているように、 !example.phpの感謝)


再現可能例

内容:

<?php 
    shell_exec("R --file='/home/username/public_html/subdirectory/example.R' --no-save 2>&1"); 
?> 
のの

内容(これは私が私のサーバー上で必要なものである):example.Rmd

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"); 

内容:この例の

--- 
title: 'Reproducable example' 
output: html_document 
--- 

```{r} 
    cat("This is an ë symbol."); 
``` 

結果:

R Studioからこれを実行すると、次のようになります。

cat( "これは記号です");

# #これは記号です。

私はPHPからこれを実行すると、私が手:

猫( "これはë記号です。");

# #これは< U + 00EB >シンボルです。

(興味深いことに、echo 'edëが正常に表示される)


私は今index.phpファイルにstr_replaceを行うに頼っが、それは理想的ではありません。

renderマニュアルを確認しましたが、この動作については何も見つかりません。

また、.RmdファイルのYAMLヘッダーでpandocのオプションを指定してみましたが、近いと思われるのは--ascii optionなので、何もしません。 R Studio RMarkdown pageにはヒントもありません。

おそらく、RStudioで設定されている環境変数と関係がありますか?私はすでに設定しなければならなかった:Rスクリプトで

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

をPandocは、PHPのシェルから呼び出されたRスクリプトで呼ばれる最初の場所で起こって取得します。これが問題であれば、RStudioがどんな値に設定するか、より正確にどの設定を重要なものに設定するのか、どうすればわかりますか?私は走った:

Sys.getenv() 

これはかなりのリストを示しています。エントリーのどれもエンコーディングとは関係ないと認識しています。

または、これを引き起こしますか? .mdファイルを保存して検査すると、Unicode要素のものが既に表示されます。しかし、knitr help page with chunk optionsは、一般にユニコードやエンコーディングについては何も言いません。

これはどこに文書化されていますか、誰かがこの状況に遭遇したことはありますか?

私はCentOS 6.8でRStudio 0.99.903とR 3.3.1を実行しています。

+1

それぞれの場合に '' Sys.getlocale( "LC_ALL")の出力は何ですか? Rセッションは、PHPの場合、UTF-8以外のロケールで実行されているとRセッションが信じている可能性があります。それが問題ならば、Rがシステムロケールで表現できないUnicode文字を発見している可能性があります。代わりにUnicodeコードポイント表現を印刷するだけです。 –

+1

@KevinUshey、これにスポットがあるようです! RStudioから、ロケールはしばしば 'en_US.UTF-8'に設定され、時には 'C'([デフォルトの見かけ上](https://stat.ethz.ch/R-manual/R-devel/library/) base/html/locales.html))。私が呼ぶときにPHPからは、唯一のCに設定しています: 'Sys.setlocale( 'LC_ALL'、 "EN_US.UTF-8");' それは働きます!ありがとうございました!!!何時間もの不満の後に何かを解決することは常に満足しています:-)あなたのコメントを答えに変えることができるので、私はそれを受け入れることができますか? – Matherion

+0

ええ ''はロケールの問題を示すことが多く、 'C'ロケールはしばしばLinuxの犯人です。 –

答えて

5

通常、UTF-8以外のロケール内でRを実行しようとすると、この形式の問題(ここではユニコード文字がユニコードコードポイント表現に変換されます)(この場合は<U+00EB>)が原因です。

通常、これはSys.getlocale("LC_ALL")の出力を確認することで確認できます。ご希望の言語に基づいて、特定のUTF-8ロケールの風味を代入

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

:あなたはCロケールが報告された表示された場合、あなたはおそらくのようなものでUTF-8ロケールを強制する必要があります。 (参考のために、利用可能なロケールのセットは、通常、locale -aのようなものを持つ端末から照会することができます)。

関連する問題