2017-08-16 17 views
0

PythonラッパーをRライブラリRdtq (https://github.com/cran/Rdtq)に書きたいと思います。 そのライブラリ(またはむしろクラスインスタンス)は、ドリフトf(x)と拡散g(x)という2つの関数をメイン入力として取ります。例えば、rpy2経由でPython Lambda関数をRに渡す

my_drift = function(x) { -x } 
my_diff = function(x) { rep(1,length(x)) } 

私はRdtqクラスのラッパーを書いていますので、私は、理想的にはラムダ関数

my_python_drift(x) = lambda x: -x 
my_python_diff(x) = lambda x: np.ones(len(x)) 

などを経て、Pythonのから直接ドリフト・拡散機能を渡したいと思います。だからもっと一般的には、私の質問は次のとおりです: rpy2を介して、Pythonラムダ(またはグローバル)関数をRにパラメータとして渡すことはできますか?

+0

をこれは[XY問題](HTTPSである:以下のPythonにRで書かRdtq githubrpy2を用いて変換し、実証しますmeta.stackexchange.com/questions/66377/what-is-the-xy-problem)。あなたは私たちにあなたのYの解決策だけを教えていますが、Xの問題は説明していません。特異性や再現性のある例で真の完全なシナリオを教えてください。あなたはそう考えるかもしれませんが、ラムダが必要かもしれません。 – Parfait

+0

十分に公正で、私は質問を調整しました。 – user56643

答えて

0

rpy2のSignatureTranslatedAnonymousPackage (STAP)を使用して、任意のRコードをPython環境で利用可能なパッケージとしてインポートすることを検討してください。 //:

R

# Loading required package: Rdtq 
require(Rdtq) 

# Assigning drift and diff functions 
mydrift = function(x) { -x } 
mydiff = function(x) { rep(1,length(x)) } 

# Running rdtq() 
test = rdtq(h=0.1, k=0.01, bigm=250, init=0, fT=1, 
      drift=mydrift, diffusion=mydiff, method="sparse") 

# Plotting output 
plot(test$xvec, test$pdf, type='l') 

パイソン

from rpy2 import robjects 
from rpy2.robjects.packages import STAP 
from rpy2.robjects.packages import importr 

# Loading required package: Rdtq 
Rdtq = importr('Rdtq') 

fct_string = """ 
my_drift <- function(x) { -x } 
my_diff <- function(x) { rep(1,length(x)) } 
""" 

# Creating package with above drift and diff methods 
my_fcts = STAP(fct_string, "my_fcts") 

# Running rdtq() --notice per Python's model: all methods are period qualified 
test = Rdtq.rdtq(h=0.1, k=0.01, bigm=250, init=0, fT=1, 
       drift=my_fcts.my_drift(), diffusion=my_fcts.my_diff(), method="sparse") 

# Load plot function 
plot = robjects.r.plot 

# Plotting by name index 
plot(test[test.names.index('xvec')], test[test.names.index('pdf')], type='l') 
+0

これは本当に良い回避策ですが、私の問題には当てはまりません。関数 'my_drift'と 'my_diff'は実行時に生成されますが、明示的に指定することはできません。 – user56643

+0

それが何を意味するのか、あなたが本当に求めていることがわかりません。がんばろう! – Parfait

+0

私は文字列として明示的に関数を指定することはできません。コードをコンパイルするとき、私は関数の形を知らず、実行時に自動的に決定されます。具体的には、ランダムなデータを入力として、そのデータをフィッティングして統合します。これは私が興味を持っているドリフト関数を与えます。なぜこの関数をオブジェクトとして渡す必要があるのか​​、この関数を明示的に文字列として書くことはできません。 – user56643

関連する問題