为何‘dim’无法作为属性名使用?如何使其正常生效?
如何在R中给标量添加名为
dim的普通属性而不报错 问题原因
dim是R内置的特殊属性(类似的还有names、dimnames等),当使用attr<-函数为对象赋值这类属性时,R会自动执行额外的校验逻辑,而非单纯添加一个属性。对于dim属性,R会强制检查对象的长度是否等于维度值的乘积:你的标量a长度为1,而c(100L, 9L)的乘积是900,两者不匹配,因此触发报错。
解决方案
要绕过特殊属性的校验逻辑,直接添加名为dim的普通属性,不要使用attr<-,而是直接修改对象的整个属性列表:
代码示例
a <- 5 # 获取对象现有属性 attrs <- attributes(a) # 向属性列表中添加dim属性 attrs[["dim"]] <- c(100L, 9L) # 重新赋值属性列表到对象 attributes(a) <- attrs # 查看结果 attributes(a) # 输出: # $dim # [1] 100 9
如果对象原本已有其他属性(比如示例中的hurz),该方法会保留原有属性:
a <- 5 attr(a, "hurz") <- "hurz" attrs <- attributes(a) attrs[["dim"]] <- c(100L, 9L) attributes(a) <- attrs attributes(a) # 输出: # $hurz # [1] "hurz" # $dim # [1] 100 9
注意事项
通过这种方式添加的dim只是一个普通属性,不会将标量转换为矩阵或数组。如果后续调用dim(a),R仍会按照特殊属性的逻辑处理,返回NULL(因为对象长度与维度乘积不匹配),但attributes(a)中可以正常看到该属性。
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

