使用错误:在%R行中未识别的参数

3

自从我发现了rpy2并且可以在我的ipython笔记本中使用%R,我的编程变得更加容易了。但是我可能遇到了难题。

我需要从一个稳定分布中生成值。我正在使用R中的stabledist包。

我需要运行以下命令:

      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单元格时,运行以下命令:
      %%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

3个回答

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

谢谢。到目前为止,我成功避免了“传统”的方式,因为它有点晦涩难懂。在这种情况下,我该如何传递变量呢?我的seq()实际上非常长,而我的脚本非常(非常!)缓慢。谢谢。 - claude
1
谢谢。已测试并且可行。顺便提一下,这两种方法所需的时间相同(我用%timeit测试过)。我使用了与我的答案类似的方式传递变量,使用%Rpush命令,但如果我使用你的建议,我就不必再使用%Rpull Fx来获取结果,因此我可以省略这一步。 - claude

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)}

然后在我的Python代码中的IPython单元格内,我调用了解决方法函数

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

它起作用了。


0

通过调用 rpy2 所公开的 R 函数,您可能会实现更好的代码清晰度:

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)

谢谢 - 这也是一个不错的选择。我会测试它,特别是看看是否有在运行时所需的时间方面的改进。 - claude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接