クイックノート

ちょっとした発見・アイデアから知識の発掘を

【R】WordPress に R Markdown を投稿する【RWordPress】

R Markdown を使うと、Rによる分析結果を簡単にHTML化することができます。
その HTML をそのまま WordPress に投稿できれば、
日々の分析結果を自動でブログに公開することができますね。

R から WordPress を操作するためのパッケージ「RWordPress」を使えば、
この自動投稿ができるのですが、
よくあるチュートリアルに従うと、
上手く動かない場合もあるようです。

今回は、そんなうまく動かない場合の使い方をまとめておくことにします。

RWordPress のインストール

WordPress のインストールは、次のコマンドで、
github 経由で行います。

install_github("duncantl/XMLRPC")
install_github("duncantl/RWordPress")

WordPress のリモート操作にXML-RPCを利用していて、
一つ目のパッケージのそのためのものです。

普通の使い方

普通の使い方をする場合は、
まず、投稿予定の R Markdown のファイルを用意したら、

options(WordpressLogin = c(user = 'Password'), 
             WordPressURL = 'http://[domain]/xmlrpc.php')
knit2wp('forsubmit.Rmd',
              title = 'title', publish = FALSE) 

ユーザーIDとパスワードは、WordpressLoginに指定していて、
userにユーザーID,Password にパスワードを入力しておきます。
WordPress のアドレスは、WordPressURL[domain]の部分に指定します。

forsubmit.Rmd は投稿するための R Markdown ファイルで、
title でタイトルを指定します。

publishFALSE なら、一旦、下書きに投稿され、
TRUEなら、そのまま投稿されます。

これで正しく動作すればいいのですが、
上手く動かない場合があります。

knit2wp のエラー

knit2wp を使うと、次のようなエラーが出る場合があります。
エラーの解決には至っていないので、
この記事では別の対応策を取ります。

エラー1: Incorrect username or password

ユーザー名とパスワードが間違えているというメッセージなので、
確認してみてください。

確認しても正しいよという場合もあります。

ここで指定できるのは、どうやらWordpress 公式の
Wordpress.com アカウント」**のようです。

エラー2: You are not allowed to publish posts on this site

公式アカウントを設定すると上の認証の問題は回避されますが、
次は投稿が許可されていないとのエラーです。

公式アカウントと連携していてもこのエラーになってしまうので、
解決方法は不明です。。。

そのため、knit2wp を使わない方法を下で紹介します。

newPost で投稿する

上のようなエラーが出るので、knit2wp で投稿することができないのですが、
なぜか、 newPost 関数からは投稿できるので、
こちらを使うこととしましょう。

content を生成する

newPost では引数に記事の中身のHTMLデータを直接指定して投稿するので、
R Markdownコンパイル部分は別に実行する必要があります。

knit2wp の中身を参考にして、content を作る関数を次のように用意しておきます。

make_content = function(input,encoding=getOption("encoding"),envir=parent.frame()){
  out = knit(input, encoding = encoding, envir = envir)
  on.exit(unlink(out))
  con = file(out, encoding = encoding)
  on.exit(close(con), add = TRUE)
  content = readLines(con, warn = FALSE)
  content = paste(content, collapse = "\n")
  content = markdown::markdownToHTML(text = content, fragment.only = TRUE)
  return(content)
}

このmake_contentを呼び出せば、 HTMLデータが文字列として得られます。

content = make_content("Rmarkdown/intro_website.Rmd")

記事を投稿する

投稿する中身ができれば、後は newPost で投稿するだけです。

WordpressURL = "https://[domain]/xmlrpc.php"
login = c(user = "Password")
newPost(content=list(description=content,title = title),
        publish = F,blogid = 0,
        login = login,.server = WordpressURL)

URLや、login情報の指定の仕方は同じですが、
.server = WordpressURLで明示的に指定することに注意しましょう。
指定されなくても勝手に読み込むことになっているようですが、
そのデフォルトの指定の場合に、knit2wpと同様のエラーが確認できました。

プライバシーポリシー