2015-06-11 22 views
2

由於我發現rpy2和在我的ipython筆記本中使用%R的可能性,我的編碼變得更容易了。但我可能撞牆了。UsageError:無法識別的參數:in%R行

我需要從一個穩定的分佈產生價值。我使用stabledist包從R.

我需要運行命令:當我定義我爲A R細胞的細胞之一

 Fx = pstable(seq(-2,4,0.1), alpha =alfa_x, beta = -1, gamma = scale_x, delta = delta_x, pm = 1, lower.tail = TRUE, log.p = FALSE, subdivisions = 1000) 

,我運行命令有:

 %%R 
     Fx = pstable(..... 

一切正常。

但我需要把這個函數放在一個python腳本中。到目前爲止,我已經使用了很多R包,並且數據的推送/拉取工作非常完美,所以它在Python腳本中使用了R代碼行(使用%R rmagic)。

但是這一個

,如果我叫Python腳本中相同的封裝和功能,以下列方式:

 python code... 
     %Rpush alfa_x 
     %Rpush scale_x 
     %Rpush delta_x 
     %R Fx = pstable(seq(-2,4,0.1), alpha =alfa_x, beta = -1, gamma = scale_x, delta = delta_x, pm = 1, lower.tail = TRUE, log.p = FALSE, subdivisions = 1000) 

我得到的用法錯誤:

 UsageError: unrecognized arguments:..... 

我基本上得到一些錯誤報告在這個老[線程] [1]

任何建議?

(我曾嘗試我的Python代碼中使用%% R,但它不會改變任何東西)

[1] https://bitbucket.org/rpy2/rpy2/issue/253/r-select-flights-year-day

回答

1

一種選擇是使用經典的方式:

import rpy2.robjects as robjects 
FX= robjects.r(''' 
     pstable(seq(-2,4,0.1), 
        alpha =alfa_x, 
        beta = -1, 
        gamma = scale_x, 
        delta = delta_x, 
        pm = 1, lower.tail = TRUE, 
        log.p = FALSE, subdivisions = 1000) 
      ''') 
+0

感謝。到目前爲止,我設法避免了「經典」方式,因爲它有點神祕。在這種情況下,我如何傳遞變量?我的seq()實際上很長,我的腳本很慢(非常!)。謝謝 – claire

+1

謝謝。測試和它的作品。作爲一個方面說明,這兩種方法需要相同的時間(我用%timeit測試它們)。我使用%Rpush命令傳遞了類似於我的答案中的變量,但是如果使用您的建議,我不必拉取結果%Rpull Fx,因此我可以保存該步驟。 – claire

0

我發現了一個解決方法,這一問題。但我想知道是否有適當的解決方案。

我創建的R細胞, 「解決辦法」 功能:

%%R 
library(stabledist) 
workaround_pstable <- function(x,alfa_x,scale_x,delta_x) 
{F = pstable(x, alpha =alfa_x, beta = -1, gamma = scale_x, delta = delta_x, pm = 1, lower.tail = TRUE, log.p = FALSE, subdivisions = 1000) 
return(F)} 

,然後在IPython的電池我的Python代碼中,我所說的解決辦法功能

python code... 
%Rpush alfa_x 
%Rpush scale_x 
%Rpush delta_x 
%R Fx = workaround_pstable(Id_unique,alfa_x,scale_x, delta_x) 

它的工作。

0

你可能會只調用R函數由rpy2外露達到更好的代碼清晰:

from rpy2 import robjects 
# get whatever is called "pstable", just like when writing 
# "pstable" in the R console 
pstable = robjects.globalenv.get('pstable') 
# same for seq... but since I know that it is coming from base, I 
# get it from there 
seq = robjects.baseenv['seq'] 
Fx = pstable(seq(-2,4,0.1), 
      alpha = alfa_x, 
      beta = -1, 
      gamma = scale_x, 
      delta = delta_x, 
      pm = 1, 
      lower_tail = True, 
      log_p = False, 
      subdivisions = 1000) 
+0

謝謝 - 這也是一個不錯的選擇。我會對它進行測試,尤其是看看運行它所需時間是否有所改進。 – claire