2015-06-11 2871 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