如何使用rpy2访问R包的内部函数?

问题描述 投票:1回答:1

我正在使用 GMCM 在Python中使用rpy2来实现R包的功能。有一些GMCM包的内部函数,只能通过使用GMCM包的 ::: 运营商。例如 作用 qgmm.marginal 不能以通常的方式使用rpy2访问。

这是我的Python代码。

import rpy2

import rpy2.robjects as robjects
from rpy2.robjects.packages import importr  
gmcm_r = importr('GMCM')
data_r = gmcm_r.SimulateGMCMData(n = 100, m =3, d=2)

print(gmcm_r.Uhat(data_r.rx2('z'))) # works
print(gmcm_r.qgmm.marginal(gmcm_r.Uhat(data_r.rx2('z')))) # does not work
# AttributeError: module 'GMCM' has no attribute 'qgmm'

相应的R代码是

library(GMCM)
data = SimulateGMCMData(n = 100, m =3, d=2)
u = Uhat(data$z) #works
GMCM:::qgmm.marginal(u, theta)#works

我们如何使用rpy2访问这些内部函数?

python r rpy2
1个回答
1
投票

你有两个错误。

  1. 你保留了一个 R 语法点 (.),你应该将其转换为python语法的下划线(_). 这就是导致你观察到的错误的原因。
  2. 一旦你修复了这个错误,不过,你会发现一个新的错误。你没有指定 theta 参数到你试图调用的函数。

这里有一个可行的解决方案。

import rpy2

import rpy2.robjects as robjects
from rpy2.robjects.packages import importr  
gmcm_r = importr('GMCM')
data_r = gmcm_r.SimulateGMCMData(n = 100, m =3, d=2)

print(gmcm_r.Uhat(data_r.rx2('z'))) # works
## [Output omitted]

u = gmcm_r.Uhat(data_r.rx2('z'))
theta = data_r.rx2('theta') ## Need to specify theta
# print(gmcm_r.qgmm.marginal(u, theta)) ## Need to change the dot after qgmm
print(gmcm_r.qgmm_marginal(u, theta))   ## to an underscore

             [,1]        [,2]
  [1,]   8.660195  0.26664200
  [2,]   7.626162  7.86828143
  [3,]   7.862762  8.75474254
## [output truncated]
© www.soinside.com 2019 - 2024. All rights reserved.