UsageError: unrecognized arguments: in %R line

UsageError: unrecognized arguments: in %R line

自从我发现了 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 包,并且 push/pull 数据运行良好,因此它在 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][1]

中报告的一些错误

有什么建议吗?

(我确实尝试在我的 python 代码中使用 %%R,但它没有改变任何东西)

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

我找到了解决此问题的方法。但我想知道是否有合适的解决方案。

我创建了一个 R 单元格,一个 "workaround" 函数:

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

成功了。

一种选择是使用经典方式:

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

您只需调用 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)