1

我正在研究 R 的行为,并发现了一些奇怪的东西。

我将使用包 geoR 作为参考,因为它是我正在使用的包。

我似乎不明白子集列表是如何工作的。我有以下代码。

install.packages("geoR", dependencies = T)
library(geoR)

v.1 <- variog(wolfcamp)
v.2 <- variog(wolfcamp, trend = "1st")

vg <- list(v.1, v.2)
names(vg) <- c("Constant", "Linear")

我在其中创建了两个变异函数(这些函数的性质不相关)。这些是“变异函数”类的对象,可以快速检查。

在每个变异函数中,我要提取两个向量“u”和“v”。由于我将它们放在一个列表中,我希望能够通过简单的子集来检索它们。

>vg[1]$Constant$u
 [1]  16.77718  50.33154  83.88591 117.44027 150.99463 184.54899 218.10335
 [8] 251.65772 285.21208 318.76644 352.32080 385.87517 419.42953

>vg[1]$Constant$v
 [1]   1796.634   3690.930   7857.991  12440.353  23165.716  31798.304
 [7]  38956.743  52007.883  67601.931  94523.535 159900.019 186464.824
[13] 219033.678

现在,如果我用引号中的中间子集调用同一个对象,我会得到相同的结果。

> vg[1]$"Constant"$u
 [1]  16.77718  50.33154  83.88591 117.44027 150.99463 184.54899 218.10335
 [8] 251.65772 285.21208 318.76644 352.32080 385.87517 419.42953

但是如果我在函数的输出上调用子集或者将对象定义为函数的输出,那么输出就不一样了。

k <- names(vg)[1]

> vg[1]$k$u
NULL

为什么会这样?它是否与如何定义类变异函数的本质有关,或者我对列表子集没有什么了解?谢谢

4

1 回答 1

1

它与“变异函数”无关,而是在我们传递对象时class提取元素的一般行为。list的结构list可以通过使用找到str(vg)

我们提取单个list元素的方式是使用[[. 这适用于对象以及元素或索引的名称,即如果我们想使用对象“k”进行提取

vg[[k]]$u
#[1]  16.77718  50.33154  83.88591 117.44027 150.99463 184.54899 218.10335 251.65772 285.21208 318.76644
#[11] 352.32080 385.87517 419.42953

请注意,vg[1]没有使用,也不需要它,因为vg[1]仍然没有提取“常量”元素。

vg[[1]]$u
#[1]  16.77718  50.33154  83.88591 117.44027 150.99463 184.54899 218.10335 251.65772 285.21208 318.76644
#[11] 352.32080 385.87517 419.42953

其中 1 是第一个列表元素,即“常量”

如果我们使用名称本身

vg[['Constant']]$u
于 2017-11-27T03:54:11.623 回答