Значение оператора "@" на языке R? - PullRequest
0 голосов
/ 03 апреля 2020

Я сталкивался со следующим, и я не выяснил назначение оператора "@". Какой смысл там? Я не делал головы / хвоста языка руководства R.

library(lattice)
library(sp)

data(meuse)
coordinates(meuse) <- ~x+y
proj4string(meuse) <- CRS("+init=epsg:28992")

p <- xyplot(copper ~ cadmium, data = meuse@data, col = "grey", pch = 20, cex = 2)

Руководства R говорят:

Использование object@name object@name <- значение </p>

Извлечение или замена содержимого слота в объекте с формальной (S4) структурой класса. Эти операторы поддерживают формальные классы методов пакета и включаются только при загрузке методов пакета (по умолчанию). См. Slot для получения более подробной информации, в частности, для различий между slot () и оператором @.

Проверяется, что объект является объектом S4 (см. IsS4), и попытка использовать @ является ошибкой. на любом другом объекте. (Существует исключение для имени .Data только для внутреннего использования.) Оператор замены проверяет, что слот уже существует на объекте (что должно быть, если объект действительно принадлежит к тому классу, который он утверждает).

Я проверил структуру "meuse" и не нашел ссылок на слот с именем "data".

1 Ответ

2 голосов
/ 03 апреля 2020

meuse - это объект S4

isS4(meuse)
[1] TRUE

Если вы возьмете структуру meuse (str_meuse), вы увидите, что некоторые поля обозначены вашим оператором @, включая один называется data. К этим слотам можно получить доступ с помощью @, аналогично тому, как вы можете видеть другие слоты в других объектах, доступ к которым осуществляется с помощью оператора $. Так что meuse@data дает вам data часть объекта meuse.

str(meuse)

Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame': 155 obs. of  12 variables:
  .. ..$ cadmium: num [1:155] 11.7 8.6 6.5 2.6 2.8 3 3.2 2.8 2.4 1.6 ...
  .. ..$ copper : num [1:155] 85 81 68 81 48 61 31 29 37 24 ...
  .. ..$ lead   : num [1:155] 299 277 199 116 117 137 132 150 133 80 ...
  .. ..$ zinc   : num [1:155] 1022 1141 640 257 269 ...
  .. ..$ elev   : num [1:155] 7.91 6.98 7.8 7.66 7.48 ...
  .. ..$ dist   : num [1:155] 0.00136 0.01222 0.10303 0.19009 0.27709 ...
  .. ..$ om     : num [1:155] 13.6 14 13 8 8.7 7.8 9.2 9.5 10.6 6.3 ...
  .. ..$ ffreq  : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
  .. ..$ soil   : Factor w/ 3 levels "1","2","3": 1 1 1 2 2 2 2 1 1 2 ...
  .. ..$ lime   : Factor w/ 2 levels "0","1": 2 2 2 1 1 1 1 1 1 1 ...
  .. ..$ landuse: Factor w/ 15 levels "Aa","Ab","Ag",..: 4 4 4 11 4 11 4 2 2 15 ...
  .. ..$ dist.m : num [1:155] 50 30 150 270 380 470 240 120 240 420 ...
  ..@ coords.nrs : int [1:2] 1 2
  ..@ coords     : num [1:155, 1:2] 181072 181025 181165 181298 18130

Посмотрите, как работает это подмножество?

str(meuse@data)
'data.frame':   155 obs. of  12 variables:
 $ cadmium: num  11.7 8.6 6.5 2.6 2.8 3 3.2 2.8 2.4 1.6 ...
 $ copper : num  85 81 68 81 48 61 31 29 37 24 ...
 $ lead   : num  299 277 199 116 117 137 132 150 133 80 ...
 $ zinc   : num  1022 1141 640 257 269 ...
 $ elev   : num  7.91 6.98 7.8 7.66 7.48 ...
 $ dist   : num  0.00136 0.01222 0.10303 0.19009 0.27709 ...
 $ om     : num  13.6 14 13 8 8.7 7.8 9.2 9.5 10.6 6.3 ...
 $ ffreq  : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
 $ soil   : Factor w/ 3 levels "1","2","3": 1 1 1 2 2 2 2 1 1 2 ...
 $ lime   : Factor w/ 2 levels "0","1": 2 2 2 1 1 1 1 1 1 1 ...
 $ landuse: Factor w/ 15 levels "Aa","Ab","Ag",..: 4 4 4 11 4 11 4 2 2 15 ...
 $ dist.m : num  50 30 150 270 380 470 240 120 240 420 ...
...