R语言中$和@是什么意思


$是S3类的引用方式,$比较常用,当一个函数里需要返回多个值(比如有变量,有向量,有矩阵)时,我们要用list,而不是return,这时如果想提取某个变量的结果,就需要用到$,默认情况下,对于 list, environment 这两种对象,$可以提取(extract)出里面的元素,对于自己定义的class,可以实现$ S3 Method。通常我们的data.frame, list. 向量等用$就可以。
@是S4类的引用方式。@比较少用。对于 S4 object,@可以提取出 slot。

比如

m1<-lm(Y~X,data=....(some data frame))
m1$coefficients

就会返回回归直线的截距和斜率。

x$y 等价于 x[["y", exact = FALSE]],用于获取dataframe或者list里面的某个变量,
比如mtcars$cyl diamonds$carat。不同之处在于 $ 可以部分匹配变量名,比如:

x <- list(abc = 1)
x$a
#> [1] 1
x[["a"]]
#> NULL

S4也有例如,有个维恩包Vennerable:S4类型,想取得里面IntersectionSets,信息必须用@符号。
@ 是R中,S4类的一个操作符,用于提取S4对象中的内容(slot),比如:

setClass("Person",
slots = list(name = "character", age = "numeric"))
alice <- new("Person", name = "Alice", age = 40)
alice@age
> [1] 40

这个时候\(是不起作用的,因为被S4类重写了。可以自己定义\)的行为。
顺便对比一下“[[” 和 $ 的效率:x <- list(axy = 1:100, b = rep(letters, each = 4))

microbenchmark(
  x[["axy"]],
  x$axy,
  x$a,
  times = 10000L,
  control = list(warmup = 1000L)
)

>
Unit: nanoseconds
       expr min lq    mean median uq   max neval
 x[["axy"]]   0  0 16.2116      0  1 27584 10000
      x$axy   0  0 28.7540      0  1 14113 10000
        x$a   0  0 40.2570      0  1 25018 10000

三种写法用时相差不大。不过需要极限优化的时候可以考虑用“[[”而不是 $。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM