S4对象for循环获取类特定输出异常:仅返回inflammation数据
问题分析与解决方案
看起来你遇到了S4对象动态提取元素的常见坑!咱们先拆解问题:
你用data$i的时候,R并不会把循环变量i解析成tissues里的字符串(比如"fat"、"muscle"),而是直接去S4对象里找名为i的slot。但你说每次都返回inflammation的数据,大概率是这个MSContinuousImagingExperiment类的$方法在找不到指定slot时,默认返回了inflammation这个slot的内容,这才导致了循环输出的结果不对。
两种可行的修复方案:
方案1:使用[[操作符(如果对象支持的话)
很多现代S4类都实现了[[提取方法,和普通列表的用法类似,可以动态传入字符串来获取对应slot:
tissues = c("fat","inflammation","muscle","glands","lumen") for (i in tissues) { print(i) print(data[[i]]) }
方案2:使用S4标准的slot()函数(更稳妥)
S4对象的核心存储单元是slot,slot()函数是R官方推荐的访问S4对象slot的方法,兼容性拉满:
tissues = c("fat","inflammation","muscle","glands","lumen") for (i in tissues) { print(i) print(slot(data, i)) }
额外说明
S4对象和咱们常用的S3对象(比如数据框、列表)结构差异很大,$操作符在S4里通常是针对特定slot做了静态绑定,没办法像S3那样动态解析变量名。所以以后处理S4对象的动态提取,优先用slot()或者[[就不会踩这种坑啦~
内容的提问来源于stack exchange,提问作者saanasum
相关产品推荐
相关产品推荐

