根据 geoR 中函数的值对 R 列表进行子集化
Subsetting R lists according to the value of a function in geoR
我正在研究 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")
我在其中创建了两个变差函数(这些函数的性质无关紧要)。这些是 class "variogram" 的对象,可以快速查看。
在每个变差函数中有两个向量,"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
为什么会这样?它是否与 class 变差函数的定义方式有关,或者我对列表子集化有什么不了解的地方吗?谢谢
与class
'variogram'没有关系,是传递对象时提取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]
仍未提取 'Constant' 元素。
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 是第一个列表元素,即 'Constant'
如果我们使用名称本身
vg[['Constant']]$u
我正在研究 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")
我在其中创建了两个变差函数(这些函数的性质无关紧要)。这些是 class "variogram" 的对象,可以快速查看。
在每个变差函数中有两个向量,"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
为什么会这样?它是否与 class 变差函数的定义方式有关,或者我对列表子集化有什么不了解的地方吗?谢谢
与class
'variogram'没有关系,是传递对象时提取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]
仍未提取 'Constant' 元素。
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 是第一个列表元素,即 'Constant'
如果我们使用名称本身
vg[['Constant']]$u