问题描述
我通过执行以下操作在python中映射RS4类:
from rpy2.robjects.packages import importr
import rpy2.robjects as ro
class MapTOS4(ro.methods.RS4):
"""
writing a child class to map to S4 reference class in python
"""
def LoadFile(self,filename):
"""access the LoadFile method of SlicedData class"""
return ro.baseenv['$'](self,'LoadFile')(filename)
def fileSliceSize(self):
"""access the class attribute or field"""
return ro.baseenv['$'](self,'fileSliceSize')
mql = importr('MatrixEQTL')
data = MapTOS4(mql.SlicedData())
print(data.fileSliceSize())
执行上述代码时,我得到了以下[1] 1000
,这是因为在该特定程序包中,类字段/属性fileSliceSize
的默认值设置为1000。但是,我试图将该类属性的值重置或更改为2000。
在R中,您可以使用以下简单的代码轻松做到这一点:
data$fileSliceSize = 2000
如何基于我在Python中的实现来实现这一目标?
非常感谢您。
解决方法
在R中,data$fileSliceSize = 2000
操作只是一个语法糖,用于调用带有三个参数( object , key , value ):
$<-
与library(MatrixEQTL)
data = SlicedData()
`$<-`(data,'fileSliceSize',2000)
# SlicedData object. For more information type: ?SlicedData
# Number of columns: 0
# Number of rows: 0
# Data is stored in 0 slices
访问相同的方式是以下语法糖:
data$fileSliceSize
该技巧用于转义函数名称中的特殊字符-您可以使用反引号调用任何R函数:
`$`(data,'fileSliceSize')
# [1] 2000
请参阅R文档的Extract chapter。
因此,在rpy2中,您可以简单地执行以下操作:
`print`('text')
# [1] "text"
但是,我建议您尝试一种更“ pythonic”的方法(为简洁起见,省略了文档字符串):
ro.baseenv['$<-'](data,2000)