前提・実現したいこと
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
pythonからRを呼び出してコードを実行したいが、正常に動作するときと、想定する結果が出力されない場合があります。うまくいかない時も、再度実行したら正常に動作することがあり、原因と解決方法を教えて頂きたいです。
やりたいこととしては、pythonからRに行列を2つ渡し、その行列を入力としてRのkNN法のライブラリFNNを用いて近傍点との距離(下記ソースでいうX)をRからpythonに引き渡したいです。
下記ソースの前半は、こちらのサイト(http://dotnsf.blog.jp/archives/1060215059.html)から引用していますが、引用しているソースはRへの引き渡しの確認用であり、躓いているところは最後の4行のみです。
該当のソースコード
python
1import numpy 2import pandas 3import pylab 4import pyper 5 6n = 200 7# データの生成 8score_x = numpy.random.normal(171.77, 5.54, n) 9score_y = numpy.random.normal(62.49, 7.89, n) 10 11score_x.sort() 12score_x = numpy.around(score_x + numpy.random.normal(scale=3.0, size=n), 2) 13score_y.sort() 14score_y = numpy.around(score_y + numpy.random.normal(size=n), 2) 15 16# 散布図を描く 17pylab.scatter(score_x, score_y, marker='.', linewidths=0) 18pylab.grid(True) 19pylab.xlabel('X') 20pylab.ylabel('Y') 21 22# Rで回帰分析 23df = {'X': score_x, 'Y': score_y} 24df = pandas.DataFrame(df) 25 26r = pyper.R(use_pandas='True') 27 28# Rへデータ渡す 29r.assign('df', df) 30 31# Rのコマンド実行 32print(r("summary(df)")) 33r("result <- lm(Y~X, data=df)") 34print(r("summary(result)")) 35 36#予測区間と信頼区間を算出するため 37new_x = numpy.arange(155, 190, 0.1) 38new_df = pandas.DataFrame({'X': new_x}) 39r.assign('new', new_df) 40 41# 予測区間(R) 42r("prediction <- predict(result, new, interval='prediction')") 43# 信頼区間(R) 44r("confidence <- predict(result, new, interval='confidence')") 45 46# Python側にとってくる 47lm_result = r.get('result$fitted.values') 48prediction = pandas.DataFrame(r.get('prediction')) 49confidence = pandas.DataFrame(r.get('confidence')) 50 51# 回帰直線, 予測区間, 信頼区間を描く 52pylab.plot(score_x, lm_result, 'r', linewidth=2) 53 54pylab.plot(new_x, prediction[1], 'g', linewidth=1) 55pylab.plot(new_x, prediction[2], 'g', linewidth=1) 56 57pylab.plot(new_x, confidence[1], 'c', linewidth=1) 58pylab.plot(new_x, confidence[2], 'c', linewidth=1) 59 60pylab.show() 61 62#ここから下が実行したい場所 63r('library(FNN)') 64r("X <- knnx.dist(prediction,confidence,3)") 65Z = r.get("X") 66Z = r.get("X")
試したこと
ソースの最後に"Z = r.get("X")"を2回書いていますが、これま誤記ではなく、2回書かないと全くZにXが格納されません。連続して成功するときもあれば、全く成功せず、pythonを再起動しなおす場合もあります。
成功する場合もあるため、ライブラリFNNのインストールは問題ないと考えております。
しかし、前半部分のRとの連携は常に正常に行えているため、"r('library(FNN)')"が正常に行えていない可能性もあります。
補足情報(FW/ツールのバージョンなど)
python3.6
R3.3
コードの実行はanaconda3インストール時に付属しているspyder3を使用しています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。