如何解决对象修改仅在列表中发生
我已将要编辑的对象放在列表中。 说,对象的名称有点像这样:
name1_X
name1_Y
name2_X
name2_Y
这些对象有不同的集合,它们存储在不同的列表中,因此对于每个不同的集合,它们的名称将略有不同,例如:
name1_P_X
name1_F1_X
name2_F2_Y
,依此类推。 因此,对于每个“名称”,都有六个对象。对于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,listbF_F2)组成的,并且这些列表包含与“ X”匹配且与“ Y”匹配的模式。 因此,基本上我想拥有两个带有已编辑对象的列表,一个匹配模式“ X”,另一个匹配模式“ Y”。
我会这样称呼匹配所需模式的列表:
listbF_ALL_X <- mget(ls(pattern=".*_X$"))
listbF_ALL_Y <- mget(ls(pattern=".*_Y$"))
因此,第一个列表将包含所有以“ 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
的对象,在其中存储嵌套列表或具有命名成员P
的类,F1
,F2
,它们依次是名称为X
和Y
的对象。然后,您可以通过name[1L]$P$X
(如果您使用的是带有插槽的S4对象,则可以访问name[1L]@P@X
)来访问对象。
或者您使用面向数据的方法,并将所有这些嵌套对象展平到具有相应列P
,F1
,F2
,X
和{{ 1}}。哪种解决方案更合适取决于您的确切用例。
现在需要警告:您可以通过使用* environments8而不是常规对象来在R中使用引用语义。复制环境时,将创建对相同环境对象的引用。但是,这种语义通常令人困惑,因为它与R中的期望相反,因此应谨慎使用。 “ R6”包会根据环境创建具有参考语义的对象系统。对于许多必不可少的参考语义的目的,“ R6”是正确的答案。
,我找到了另一个解决方案: 我继续修改了这一部分:
import pandas as pd
df1 = pd.DataFrame({1: [20],2: [30]}) # here would be your first sql-query
df2 = pd.DataFrame({1: [20],2: [30]}) # here would be your second sql-query
df1.equals(df2) # results in True/False
不从环境中调用对象,而是从每个列表中调用对象:
listbF_ALL_X <- mget(ls(pattern=".*_X$"))
listbF_ALL_Y <- mget(ls(pattern=".*_Y$"))
这不是最漂亮的方法,但是它可以工作,在我来说,这是需要在脚本中进行最少更改的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。