Note of Pediatric Surgery

腸内細菌、R、ときどき小児外科

Rパッケージのtabulizerをインストールするのにえらく苦労した話

0. はじめに

とあるテーブルデータを依頼したらPDFファイルで届いたということはよくあることだと思います。PDFをtableファイルに変換する方法はいろいろあると思いますが、手軽なのはアップロードしてくれると.xslxや.csvに変換してくれる、PDFTableでしょうか?

pdftables.com

このサイトも使いやすくはあるのですが、少し変換結果がイマイチだったのと、複数のファイルがあったのでやっぱりRで変換したいと思っていました。パッケージの{tabulizer}を使えばできるようです。Qiitaの記事でもこの熱の入れよう。

qiita.com

僕の勇んでインストールしようとしたところ、エラーが出てまったく動かず。数時間かけてようやくインストールできました。手当たり次第Google先生に聞いて、何とかインストールできました。なぜインストールできたのかはよくわからないのですが、困っている人は参考にしていただければと思います。結構いるのでは?

ちなみに当方、macOS High Sierra 10.13.5の環境です。

1. とりあえずinstallを試してみる

suryu.me

こちらの記事を参考に普通にやってみました。どうやら{tabulizer}だけでなく{tabulizerjars}も必要なようです。jarsってなんじゃい?と思ったのですが、どうやらJavaのJARファイルのことを言っているようです。JARファイルって何じゃいって話ですが、「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典によると

JAR形式の圧縮ファイルだよ
拡張子が「.jar」だよ
ZIPファイルの親戚だよ

こういうことのようです。ORACLEのサイトに書いてあることとか、さっぱりわかりませんが、確かにわかった気になれました。

library(githubinstall)
githubinstall(c("tabulizerjars", "tabulizer"))

library(tabulizer)
library(tabulizerjars)

これで上手くインストールできていれば、当たり前ですがこの記事の価値はないですね。で僕の場合は、いろいろなERRORが出てきて、もはやよく覚えていませんが、とにかく駄目でした。駄目な人は僕の記事を参考に試してみてください。

2. Rを3.4.Xから3.5にupdateする

まず差し当たって目についたエラーメッセージが以下のものでした。

unknown timezone 'zone/tz/2017c.1.0/zoneinfo/Asia/Tokyo'

timzoneがどうのこうのと怒られている。エラーメッセージでググってみると。

uribo.hatenablog.com

こんな記事に出会いました。

これはOSとR間でのバグらしく、すでに報告が上がっている。
17355 – unknown timezone when printing (on OSX High Sierra)
で、この問題は次期バージョンとなるR 3.4.3で修正されるらしい。ちなみにR 3.4.3は今日リリースされた(というのを先ほどメーリングリストで知った)ので、バイナリも近いうちにダウンロード可能になるだろう。安心安心。

ということなのでRを3.5にアップデートしてしまおう。RをRstudio経由でアップデートする方法はいろいろあると思うのだけど、いつもどうしているのか忘れてしまった。3 Methods to update R on RStudio (for Windows & Mac)を参考にすると{updateR}というパッケージが使えるらしい。( Macでしか使えないってことなのかな? )

Similar to installr, updateR is the package to help updating R on Mac OS.
The R code you will need is these 5 lines: (credit goes to jroberayalas for the code)
install.packages('devtools') #assuming it is not already installed

library(devtools)
install_github('andreacirilloac/updateR')
library(updateR)
updateR(admin_password = '自分のMacのパスワード')

うまくアップデートできたか確認してみる。3.5にアップデートできた。

> sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.5



3. rJavaをインストールする

もう一度、{tabulizer}と{tabulizerjars}をインストールしようとすると、どうやら{rJava}というパッケージがダメ!と怒られているようである。とりあえず普通に{rJava}をインストールしようとするが上手くいかない。

install.packages("rJava")
library(rJava)

を実行したのだけど、とりあえず上手くいきませんでした。どういうエラーが出たかは定かではない。ググってみると普通にインストールするだけではダメな模様。

github.com

こちらを参考にすると、OSX 10.10以上では、正しくインストールするためには以下の手順を踏んでねーとのことです。というわけで、ターミナルを開いて、下記のスクリプトを走らせませした。正直よくわかってないので、実行は自己責任でお願いします。

必要なアプリケーションは

Xcode Command Line Tools
Java 6
Java 8
R
rJava source package
Database JDBC jar file
RStudio (optional)

とのことです下記のスクリプトを実行して足りないコマンドは適宜ググってインストールして下さい。

A. Javaをインストールする

# Downloadsのフォルダに移行
cd $HOME/Downloads 

# ちょっとこのスクリプトの意味わかんない
script osx-rjava-install.log

# xcodeが入っていなければインストールする
xcode-select --install 

# Java 6をインストールする
curl -#ROL https://support.apple.com/downloads/DL1572/en_US/javaforosx.dmg
open javaforosx.dmg

# Java 8もインストールする ( 何故両方必要かはよくわかりません )
curl -#ROL -b "oraclelicense=a"  http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-macosx-x64.dmg  
open jdk-8u111-macosx-x64.dmg

B. JAVA_HOMEの設定

上の記事にはJavaがインストールし終わったら下記のコマンドを入力せよとあります。

/usr/libexec/java_home -V
java -version

これはなんぞやと思って調べてみると、

バージョンが異なる複数のjava appの開発を行うケースなどで、同じMacのローカル環境でjava/javacのバージョンを切り替えて使いたいケースがあります。
xcode toolsには java_home という複数のバージョンのjavaそれぞれのhome directoryのpathを表示してくれるコマンドがあるので、これを使うとそれが可能になります。

qiita.com

ということでした。Java6と8両方インストールしているからってことなんでしょうけど、実際に実行したコマンドは-Vのオプションの後に何も指定しなかったんですが、いいんですかね…。

ちなみにlibexecは何かというと補助コマンドを置く場所のようです。

oswald.hatenablog.com

/usr/local/binなどにあるコマンドから内部的に呼ばれる補助コマンドはどこに置くかというと、/usr/libexecまたは/usr/local/libexecに置くのが一般的なようです。

ここまで来ると、文字列がわーっと出てくると思います。そしたらここまでは上手くいっているはず

C. RをインストールしてCMDをする

Rをインストールするのは、終わっていると思うので割愛します。で恐らく、一番大切なコマンドは、この後にある

sudo R CMD javareconf

かと思います。これはRにJava 8を使いますよーということを知らせるための宣言のようです。こちらのサイトも参考になるかと。

qiita.com

github.com

この状態でもう一度実行すると上手く{rJava}がインストールできているのではないでしょうか?

install.packages("rJava")
library(rJava)

もしくはターミナルから下記のコマンドだったかもしれません。ちゃんとログをとっていなかったので…どちらかで上手くいくと思うのですが…

unset JAVA_HOME
R --quiet -e 'install.packages("rJava", type="source", repos="http://cran.us.r-project.org")'



D. よくあるエラー

Error : .onLoad failed in loadNamespace() for 'rJava', details:
 call: dyn.load(file, DLLpath = DLLpath, ...)
 error: unable to load shared object '/Library/Frameworks/R.framework/Versions/3.3/Resources/library/rJava/libs/rJava.so':

こういうエラーがよく出るそうです ( 僕も出ました )。そんな時は下記のスクリプトを試してみて下さい。

# コマンドラインから立ち上げる
LD_LIBRARY_PATH=`/usr/libexec/java_home`/jre/lib/server open -a rstudio
LD_LIBRARY_PATH=`/usr/libexec/java_home`/jre/lib/server open -a R

# libjvm.dylibへのsymlinkを作成する
sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib

まずsymlinkとは、symbolic linkの略で、「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典によると

ファイルやフォルダの成りすましファイルだよ UNIX関連で登場するよ 本物に中継するのが役目だから、それ自体に中身は無いよ Windowsにおける「ショートカット」みたいなものだよ

ということです。恐ろしいほどわかりやすい。

これでもエラーが出るのなら、下記の記事を参考に

suryu.me

stackoverflow.com

dyn.load("/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/server/libjvm.dylib")
library(tabulizer)

を動かしてみて下さい。

dyn.load()という関数はR外部の関数の呼び出しに使われるやつで、エラーメッセージでLibrary not loaded: @rpath/libjvm.dylibと言われているのでインストールされているlibjvm.dylibのパスを指定するというもの。

ということみたいです。

4. 最後にもう一度tabulizerのインストールを試す

library(githubinstall)
githubinstall(c("tabulizerjars", "tabulizer"))

library(tabulizer)
library(tabulizerjars)

きっと上手くインストールできるはずです ( すみません、僕はできました )。思わず職場でガッツポーズをしてしまいました。皆様のご健闘を祈ります!