2017-08-16 47 views
0

我想圍繞R庫Rdtq (https://github.com/cran/Rdtq)編寫一個Python包裝器。 該庫(或更確切地說,類實例)將主要輸入作爲兩個函數:漂移f(x)和擴散g(x)。例如,通過rpy2將Python Lambda函數傳遞給R

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

因爲我寫周圍的Rdtq類的包裝,我想直接從Python中通過漂移和擴散功能,通過lambda函數

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

等理想。所以更一般地說,我的問題是: 我可以通過rpy2將Python lambda(或全局)函數作爲參數傳遞給R嗎?

+0

這是一個[XY問題](https://開頭meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。您只告訴我們您的Y解決方案,但不解釋X問題。請給出真實的,完整的方案,並提供具體或可重複的例子。雖然你可能會這樣想,但你可能需要'lambda'。 – Parfait

+0

夠公平的,我已經調整了這個問題。 – user56643

回答

0

考慮使用rpy2的SignatureTranslatedAnonymousPackage (STAP)在Python環境中導入任意R代碼作爲可用包。爲了演示,寫入中的R到Python的Rdtq github使用rpy2以下轉換:

ř

# 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') 

的Python

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