【问题标题】:Understanding difference between attr(x, "class") and class(x)理解 attr(x, "class") 和 class(x) 之间的区别
【发布时间】:2019-02-23 13:32:27
【问题描述】:

背景

我正在查看 Romain François 提出的 jazz 包。 Romain 定义了一个函数is_bare_vector,语法如下:

is_bare_vector <- function(x) {
  is_vector(x) && !is.object(x) && is.null(attr(x, "class"))
}

问题

发给:x &lt;- 1

attr(x, "class")
# NULL

鉴于:

class(x)
# [1] "numeric"

我想了解为什么这两个函数会提供不同的答案??attr 上的帮助参考了?class

?attr

注意一些属性(即classcommentdimdimnamesnamesrow.namestsp) 被特殊对待并有限制 关于可以设置的值。 (请注意,这不适用于级别 应通过水平替换功能为因子设置。)

?class

许多 R 对象都有一个类属性,一个字符向量给出 对象继承的类的名称。 (职能 oldClassoldClass&lt;-获取和设置属性,也可以是 直接完成。)

【问题讨论】:

    标签: r class oop primitive


    【解决方案1】:

    您只需在help("class") 中进一步阅读:

    如果对象没有类属性,则它有一个隐式类,特别是“矩阵”、“数组”、“函数”或“数值”或 typeof(x) 的结果(类似于 mode( x))

    如果class属性为NULL,显然class()也会返回隐式类;让我们检查一下C source code -- 我们看到,如果类属性的长度为 0,它会得到 implicit 类。:

    SEXP R_data_class(SEXP obj, Rboolean singleString)
    {
        SEXP value, klass = getAttrib(obj, R_ClassSymbol);
        int n = length(klass);
        if(n == 1 || (n > 0 && !singleString))
        return(klass);
        if(n == 0) {
        SEXP dim = getAttrib(obj, R_DimSymbol);
        int nd = length(dim);
        if(nd > 0) {
            if(nd == 2)
            klass = mkChar("matrix");
            else
            klass = mkChar("array");
        }
        else {
          SEXPTYPE t = TYPEOF(obj);
          switch(t) {
          case CLOSXP: case SPECIALSXP: case BUILTINSXP:
            klass = mkChar("function");
            break;
          case REALSXP:
            klass = mkChar("numeric");
            break;
          case SYMSXP:
            klass = mkChar("name");
            break;
          case LANGSXP:
            klass = lang2str(obj, t);
            break;
          default:
            klass = type2str(t);
          }
        }
        }
        else
        klass = asChar(klass);
        PROTECT(klass);
        value = ScalarString(klass);
        UNPROTECT(1);
        return value;
    }
    

    【讨论】:

    • 非常感谢详细的解释,隐式类,源码很有用。
    • @Konrad 没问题!在我查看 C 源代码之前,我在 R 中遇到了许多让我感到困惑的事情。有很多“幕后”的东西,文档要么不会解释,要么有点不透明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2018-01-04
    • 2011-06-09
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多