gpt4 book ai didi

r - 在 R 中通过 $ 和 @ 提取有什么区别?

转载 作者:行者123 更新时间:2023-12-04 02:01:45 25 4
gpt4 key购买 nike

我想知道“组件/插槽提取”(通过 ?Syntax )运算符之间的区别是什么 $ (美元符号)和 @ (在符号处)在 R 中。

这是 $ 的示例:

yo=data.frame(c(1:10), c(rnorm(10,0,1)))
yo$c.1.10.

打印:
 [1]  1  2  3  4  5  6  7  8  9 10
yo@c.1.10.
Error: trying to get slot "c.1.10." from an object (class "data.frame") that is not an S4 object

这是 @ 的示例:
setClass("track", representation(x="numeric", y="numeric"))
myTrack <- new("track", x = -4:4, y = exp(-4:4))
myTrack@x

打印:
[1] -4 -3 -2 -1  0  1  2  3  4
myTrack$x
Error in myTrack$x : $ operator not defined for this S4 class

在任何一种情况下,为什么一个有效而另一个无效?

另一个例子是以下来自 SoDA R 中的包,在函数中 geoXY :
library(SoDA)
xy <- geoXY(gpsObject1@latitude, gpsObject1@longitude, unit = 1000)
plot(xy[,1], xy[,2], asp = 1)

最佳答案

我在 R Language defenition 中没有看到关于此的任何内容(通过 this 问题),

但是区别基本上是:@ 是针对 S4 对象的,$ 是针对列表(包括很多 S3 对象)。

这可能有点抽象,所以如果您想知道给定对象使用什么,只需查看 str ,例如:

str(yo)
# 'data.frame': 10 obs. of 2 variables:
# $ c.1.10. : int 1 2 3 4 5 6 7 8 9 10
# $ c.rnorm.10..0..1..: num -0.536 -0.453 -0.599 1.134 -2.259 ...

在这里我们可以看到 $,所以 $就是用的。

或者,
str(myTrack)
# Formal class 'track' [package ".GlobalEnv"] with 2 slots
# ..@ x: int [1:9] -4 -3 -2 -1 0 1 2 3 4
# ..@ y: num [1:9] 0.0183 0.0498 0.1353 0.3679 1 ...

在这里,我们看到 @ ,所以 @ 就是要使用的。

当 S4 对象在它的一个插槽中有一个列表时,这会变得更加困惑(我首先想到的是 SpatialPolygonsDataFrame ,其中 data 插槽中的列可以通过 spdf@data$column 访问)

也许还可以参见 ?slot ,它提供了与 @ 相关的更多细节, ?isS4 用于替代 str 以告诉您 @ 是否可以与对象一起使用,或者 Chapter of Hadley Wickham's book on S4 objects 以了解更多关于 S4 的一般情况。

关于r - 在 R 中通过 $ 和 @ 提取有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33846350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com