1. 程式人生 > 其它 >R語言中$和@是什麼意思

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

三種寫法用時相差不大。不過需要極限優化的時候可以考慮用“[[”而不是 $。