Python 如何更改RS4类属性-rpy2的默认值
我通过以下操作在python中映射一个类RS4:Python 如何更改RS4类属性-rpy2的默认值,python,r,python-3.x,rpy2,Python,R,Python 3.x,Rpy2,我通过以下操作在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 Load
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
操作只是调用$Thanky you@krassowski的语法糖,非常感谢您的回答,它很有效,现在我可以获取和设置类属性了。是否有一种方法可以设置和获取属性,而不必使用“get_r_attribute=ro.baseenv['$']和set_r_attribute=ro.baseenv”['$你为什么不喜欢get_r_属性和set_r_属性?我真的很喜欢它,但我想看看是否有办法让它更像Python?如果我要修改某些东西,我会保留get_r_属性
/set_r_属性
(它们解释了发生了什么),但是尝试使用\uuuu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu呃,我投票赞成,我会接受你的回答。
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')
# [1] 2000
`print`('text')
# [1] "text"
ro.baseenv['$<-'](data, 'fileSliceSize', 2000)
from rpy2.robjects.packages import importr
import rpy2.robjects as ro
# assigning these R operators here will make the code easier to read
# and provide a (negligible in this case) performance increase.
get_r_attribute = ro.baseenv['$']
set_r_attribute = ro.baseenv['$<-']
class MapTOS4(ro.methods.RS4):
def __init__(self, r_obj, file_slice_size=2000):
super().__init__(r_obj)
self.file_slice_size = file_slice_size
def load_file(self, filename):
return get_r_attribute(self, 'LoadFile')(filename)
@property
def file_slice_size(self):
return get_r_attribute(self, 'fileSliceSize')
@file_slice_size.setter
def file_slice_size(self, value):
set_r_attribute(self, 'fileSliceSize', value)
mql = importr('MatrixEQTL')
data = MapTOS4(mql.SlicedData())
print(data.file_slice_size)
# prints 2000
data.file_slice_size = 3000
print(data.file_slice_size)
# prints 3000
# setting a value initialization:
data = MapTOS4(mql.SlicedData(), file_slice_size=4000)
print(data.file_slice_size)
# prints 4000