【问题标题】:Meaning of "@" operator in R language?R语言中“@”运算符的含义?
【发布时间】:2020-04-04 01:28:14
【问题描述】:

我遇到了以下内容,但我还没有弄清楚“@”运算符的用途。那里有什么意义?我没有对 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 手册说

用法 对象@名称 对象@名称

提取或替换具有正式 (S4) 类结构的对象中插槽的内容。 这些运算符支持包方法的正式类,并且仅在加载包方法时启用(默认情况下)。有关更多详细信息,请参阅 slot,特别是 slot() 和 @ 运算符之间的区别。

检查 object 是否为 S4 对象(参见 isS4),尝试在任何其他对象上使用 @ 是错误的。 (name .Data 有一个例外,仅供内部使用。)替换运算符检查对象上是否已经存在槽(如果对象确实来自它声称的类,则它应该存在)。

我检查了“meuse”的结构,没有发现对名为“data”的槽的引用。

【问题讨论】:

标签: r ggplot2 lattice


【解决方案1】:

meuse 是一个 S4 对象

isS4(meuse)
[1] TRUE

如果您采用meuse (str_meuse) 的结构,您会看到一些字段用@ 运算符表示,包括一个称为data 的字段。可以使用@ 访问这些插槽,类似于使用$ 运算符访问的其他对象中的其他插槽。所以meuse@data 给了你meuse 对象的data 部分。

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 ...

【讨论】:

  • 奇怪的是,当我在 meuse 上执行 str() 时没有得到该输出。有了这个,我就不会费心问这个问题了 :) Wickham 也给出了一个有用的解释......“(@ 相当于 $,slot() 到 [[.)”
  • @user2438292 再次检查。开始一个新的会话。然后尝试str(meuse) Before 你使用coordinates(meuse)&lt;- ~x+yAfter 你已经使用它....也尝试isS4 在这两种情况下看看....
猜你喜欢
  • 1970-01-01
  • 2013-05-07
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多