QGIS2.0〜2.4(windows)のプロセッシングでRを実行する方法

QGIS2.0〜2.4のプロセッシングからRを呼び出す方法を紹介します。(ハマったので、その解決メモです。)

※32bit環境と、64bitマシンに32bitインストーラ、でしか試していません。64bitマシンに64bitインストーラで動作するかどうかは不明です。

ポイントとしては、一度、管理者としてQGISを起動して、プロセッシングのRを実行する必要があるというところです。

追記A

QGISからRライブラリのインストールが失敗するのはUACが有効になっていたのが原因でした。UACを無効にしたらインストールできるようになりました。ただ、セキュリティを変更する操作なのでご自分の判断でお願いします。(UACを無効にする方法はググってください。Windows7だと簡単にUACを無効にできますが、Windows8だとレジストリを変更する必要があるようなのでハードルが高いです。)

追記B

Rを管理者で実行してrgdalなどの必要なライブラリをあらかじめインストールしておき、それからQGISを実行していも良いです。

1. Rをインストールする。

このあたりから(現時点での最新は3.1.0)
http://www.r-project.org/

2. QGISをインストールする。

このあたりから(32bitのインストーラーを利用)
http://trac.osgeo.org/osgeo4w/

3. プロセッシングの設定

QGISを起動して、メニュー→プロセッシング→オプションと構成→プロバイダ→R scriptsで

  • Activateにチェック
  • Rfolderで"C:\Program Files\R\R-3.1.0\"を選択(Rのバージョンによって変更してください。)

4. Rライブラリのインストール(管理者で)

管理者としてQGISを起動します。(QGISアイコンを右クリック→管理者として実行)
プロセッシングから実行したいRのプログラムを選択します。(たとえば、Raster histogram)
必要なRライブラリがインストールされます。(たとえば、rgdal、raster)

※管理者としてQGISを起動するとファイルのドラッグ&ドロップができなくなるみたいです。

5. 普通にQGISを起動

通常に起動して、プロセッシングのRが実行できるようになっているか確認します。

解説

プロセッシングからRを呼び出すときに、必要なRライブラリが入っていなければ、最初にインストールしようとします。その場所は、"C:\Program Files\R\R-3.1.0\library"となっているので、管理者権限がないと書き込みできずエラーとなります。なので、一旦、管理者としてライブラリをインストールしておけば、それ以降は、普通にQGISを起動してもRのライブラリを呼び出すことができるようになるという訳です。

※実行するRのプログラムによって必要なライブラリが異なるので、そのときは、同様に管理者としてプロセッシングからRのプログラムを実行してライブラリを一旦インストールしてください。
※RのGUIからrgdalやrasterなどのRライブラリをインストールすると、Rを管理者として実行していない場合はデフォルトでは"C:\Users\your_name\Documents\R\win-library"に保存されるようです。けれども、QGISは、その場所を参照しません。



追記1

現状では、グラフの出力はOKですが、コンソールの結果表示が上手くいきません。
以下の部分を変更すれば、出力できました。(改行コードの問題ですね)

C:\OSGeo4W\apps\qgis\python\plugins\processing\algs\r\RUtils.py

def createConsoleOutput():
        RUtils.consoleResults = []
        RUtils.allConsoleResults = []
        add = False
        if os.path.exists(RUtils.getConsoleOutputFilename()):
            lines = open(RUtils.getConsoleOutputFilename())
            for line in lines:
-               line = line.strip('\n').strip(' ')
+              line = line.strip().strip(' ')
                if line.startswith('>'):
                    line = line[1:].strip(' ')
                    if line in RUtils.verboseCommands:
                        add = True
                    else:
                        add = False
                elif add:
                    RUtils.consoleResults.append('<p>' + line + '</p>\n')
                RUtils.allConsoleResults.append(line)

pullリクエストってどうやるんだろ?

追記2

64bit環境では、追記1の部分を変更しなくても、コンソール出力は問題ありませんでしたが、グラフ出力ができませんでした。
ソースコードは32bitバージョンと同じだと思うのですが、なんででしょうねー?

報告あがってました
http://hub.qgis.org/issues/9203

追記3

Windows8.1 32bitだとグラフ出力でエンコードエラーになったので、以下を修正すると大丈夫でした。

それにしても、OS環境による違いでこんな所に影響あるんですかね?よくわかりません。

C:\OSGeo4W\apps\qgis-dev\python\plugins\processing\algs\r\RUtils.py

def createRScriptFromRCommands(commands):
        scriptfile = open(RUtils.getRScriptFilename(), 'w')
        for command in commands:
-            scriptfile.write(command + '\n')
+           scriptfile.write(command.encode('utf-8') + '\n')
        scriptfile.close()

その後、なぜか、この変更をしなくてもエラーでなくなりました。