如何更改 RS4 Class 属性的默认值 - rpy2
How to Change The Default Value of RS4 Class Attribute - rpy2
我正在通过执行以下操作在 python 中映射 class 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
这是预期的,因为在那个特定的包中 class field/attribute fileSliceSize
它的默认值设置为1000。但是,我正在尝试将 class 属性的值重置或更改为 2000。
在 R 中,您可以使用以下简单代码轻松做到这一点:
data$fileSliceSize = 2000
如何根据我在 Python 中的实现实现此目的?
在此先感谢您。
在 R 中,data$fileSliceSize = 2000
操作只是一个语法糖,用于调用具有三个参数的 $<-
函数(object,键, 值):
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
的访问方式相同,是一个语法糖:
`$`(data, 'fileSliceSize')
# [1] 2000
反引号用于转义函数名称中的特殊字符 - 您可以使用反引号调用任何 R 函数:
`print`('text')
# [1] "text"
在 Extract chapter 的 R 文档中查看更多内容。
因此,在 rpy2 中你可以简单地做:
ro.baseenv['$<-'](data, 'fileSliceSize', 2000)
但是,我建议尝试一种更“pythonic”的方法(为简洁起见省略了文档字符串):
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
我正在通过执行以下操作在 python 中映射 class 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
这是预期的,因为在那个特定的包中 class field/attribute fileSliceSize
它的默认值设置为1000。但是,我正在尝试将 class 属性的值重置或更改为 2000。
在 R 中,您可以使用以下简单代码轻松做到这一点:
data$fileSliceSize = 2000
如何根据我在 Python 中的实现实现此目的?
在此先感谢您。
在 R 中,data$fileSliceSize = 2000
操作只是一个语法糖,用于调用具有三个参数的 $<-
函数(object,键, 值):
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
的访问方式相同,是一个语法糖:
`$`(data, 'fileSliceSize')
# [1] 2000
反引号用于转义函数名称中的特殊字符 - 您可以使用反引号调用任何 R 函数:
`print`('text')
# [1] "text"
在 Extract chapter 的 R 文档中查看更多内容。
因此,在 rpy2 中你可以简单地做:
ro.baseenv['$<-'](data, 'fileSliceSize', 2000)
但是,我建议尝试一种更“pythonic”的方法(为简洁起见省略了文档字符串):
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