r-对象修改仅发生在列表中



我已经将要编辑的对象放在了列表中。比如说,对象的名称有点像这样:

name1_X
name1_Y
name2_X
name2_Y

这些对象有不同的集合,它们存储在不同的列表中,所以对于每个不同的集合来说,它们都有一个稍微不同的名称,比如:

name1_P_X
name1_F1_X
name2_F2_Y

等等。。因此,对于每一个";name";有六个物体。P、F1、F2有两个,每个都以X或Y结尾。我们有三个列表(listbF_P、listbF_F1和listbF_F2(,每个列表都包含以X和Y结尾的对象。

我这样编辑列表中的对象(例如,只有一个列表(:

for (i in 1:NROW(listbF_P)){
listbF_P[[i]]@first.year <- 1986
listbF_P[[i]]@last.year <- 2005
listbF_P[[i]]@year.aggregate.method <- "mean"
listbF_P[[i]]@id <- makeFieldID(listbF_P[[i]])
}

当我检查更改是否成功应用时,它只在引用列表中的对象而不是相同的对象时起作用;未上市";。

所以如果我打电话给

listbF_P[[1]]@last.year

它返回

"2005"

但如果我打电话给

name1_X@last.year

它返回

"Inf"

这样做的问题是,我希望稍后将编辑后的对象放在不同的列表中。因此,我需要后一个调用示例返回";2005";或者我可以在多个列表中搜索某个对象名称模式,将符合该模式的对象放入另一个列表中。这是因为上面的例子是用多个列表(listbF_P、listbF_F1、listb_F2(制成的,并且这些列表包含模式匹配";X〃;以及另一个匹配";Y";。所以基本上我想要有两个带有编辑对象的列表,一个匹配的模式"X〃;而另一个匹配图案";Y";。

我会把匹配所需模式的列表称为:

listbF_ALL_X <- mget(ls(pattern=".*_X$"))
listbF_ALL_Y <- mget(ls(pattern=".*_Y$"))

因此,第一个列表将包含以"0"结尾的所有对象;X〃;,例如:

name1_P_X
name1_F1_X
name1_F2_X
name2_P_X
[...]

我想要我之前在循环中编辑过的

但是当调用该列表中的对象时

listbF_ALL_X[[1]]@last.year

再次只返回

"Inf"

因为它将对象从环境中移除,而不是从列表中移除。但我希望它返回已更改的所需数字(例如"2005"(。

我希望我的问题和解决问题的两种可能方法都清楚。。如果不是,问:(

感谢任何输入

问候

在R中,与许多其他现代语言不同,(几乎(所有对象在逻辑上都是彼此的副本。不能有多个名称引用同一个对象(请参阅下面的注意事项(。

但是,即使这是支持的,你的设计看起来也很混乱。与其有很多具有不同名称的相关对象,不如将对象放入逻辑关联的嵌套列表和类中。也就是说,不应该有名称为name{1..10}_{P,F1,F2}_{X,Y}的对象,而应该有一个列表name,在其中存储具有命名成员PF1F2的嵌套列表或类,这些命名成员又是名称为XY的对象。然后,您可以通过name[1L]$P$X(或者name[1L]@P@X,如果您使用带有插槽的S4对象(访问对象。

或者,您可以使用更面向数据的方法,将所有这些嵌套对象展开为具有相应列PF1F2XY的表。哪个解决方案更合适取决于您的确切用例。


现在需要注意的是:通过使用*environments8而不是常规对象,可以在R中使用引用语义。复制环境时,会创建对同一环境对象的引用。然而,这个语义通常是令人困惑的,因为它与R中的预期相反,所以应该小心使用。"R6"包创建了一个具有基于环境的引用语义的对象系统。对于引用语义不可或缺的许多目的,"R6"是正确的答案。

我找到了另一个解决方案:我接着修改了这个部分:

listbF_ALL_X <- mget(ls(pattern=".*_X$"))
listbF_ALL_Y <- mget(ls(pattern=".*_Y$"))

不从环境中调用对象,而是通过从每个列表中调用对象:

listbF_ALL_X <- c(c(listbF_P, listbF_F1, listbF_F2)[grepl(".*_X$", names(c(listbF_P, listbF_F1, listbF_F2)))])
listbF_ALL_Y <- c(c(listbF_P, listbF_F1, listbF_F2)[grepl(".*_Y$", names(c(listbF_P, listbF_F1, listbF_F2)))])

这不是最漂亮的方法,但它很有效,在我的情况下,它是我的脚本中需要最少更改的解决方案。

最新更新