循环根据 r 中的列表分配新对象名称

loop to assign new objects names based on list in r

我是阅读 xml 文件的新手,在将它们转换为列表后,我一直在尝试分配环境的新对象名称。

我读取了一个目录的35个文件,并用XML包的xmlParse解析了它们。他们,我把他们转化成了一个列表。

for(i in dir()){
  assign(i, xmlParse(i))}

for(i in ls()){
  assign(i, xmlToList(i))
}

rm(i)

所有文件都是这样的名称:

ls()

 [1] "en_product3_146.xml" "en_product3_147.xml" "en_product3_148.xml" "en_product3_149.xml"
 [5] "en_product3_150.xml" "en_product3_152.xml" "en_product3_156.xml" "en_product3_181.xml"
 [9] "en_product3_182.xml" "en_product3_183.xml" "en_product3_184.xml" "en_product3_185.xml"
[13] "en_product3_186.xml" "en_product3_187.xml" "en_product3_188.xml" "en_product3_189.xml"
[17] "en_product3_193.xml" "en_product3_194.xml" "en_product3_195.xml" "en_product3_196.xml"
[21] "en_product3_197.xml" "en_product3_198.xml" "en_product3_199.xml" "en_product3_200.xml"
[25] "en_product3_201.xml" "en_product3_202.xml" "en_product3_203.xml" "en_product3_204.xml"
[29] "en_product3_205.xml" "en_product3_209.xml" "en_product3_212.xml" "en_product3_216.xml"
[33] "en_product3_229.xml" "en_product3_231.xml" "en_product3_233.xml"

所有这些文件都具有相同的结构,我想将对象名称替换为这些列表的值。 路径是:

    head(en_product3_150.xml$DisorderList$Disorder$ClassificationNodeList$ClassificationNode$ClassificationNodeChildList[5]$ClassificationNode$Disorder$Name$text)

[1] "Disorder of carbohydrate metabolism"

head(en_product3_147.xml$DisorderList$Disorder$ClassificationNodeList$ClassificationNode$ClassificationNodeChildList[5]$ClassificationNode$Disorder$Name$text)

[1] "Digestive tract malformation"

我在尝试 assign 一个新名称时遇到了一些问题,就像上面的代码一样,但我没有成功。

for(i in ls()){
assign(paste0(i,"$DisorderList$Disorder$ClassificationNodeList$ClassificationNode$ClassificationNodeChildList[5]$ClassificationNode$Disorder$Name$text"), i)}

如果能提供一些提示,我将不胜感激。提前致谢!

您可能需要先使用get()访问您环境中的对象,创建新对象的名称,然后使用assign()分配。

rm(list = ls())

# put some things in the environment
x <- list(a = "hello", b = "world")
y <- list(a = "hola", b = "mundo")
z <- list(a = "bonjour", b = "monde")

# loop through environment objects; 
# use get() to access, and assign() to put back 
for (i in ls()) {
  temp <- get(i)
  new_name <- temp$a
  assign(new_name, temp)
  rm(i, temp) # removes object i, not the object whose name is stored in i
}

ls()

请注意,使用此代码,您将拥有两个名称不同但内容相同的对象。

重新考虑保存单独的许多 对象淹没您的全球环境。而是将相似的结构化对象存储在列表中以进行可索引搜索和一致处理。因此,您无需管理 35 个对象,而只需管理 一个 个包含 35 个元素的对象。

对于通过迭代处理构建的此类结构,请考虑 lapply 或其包装器 sapply,因为它保留了名称。 apply 系列是隐藏循环,returns 一个对象(一个或多个)与它的输入具有相同的长度:

xmls <- sapply(dir(), function(f) {
    x <- xmlParse(f)
    lst <- xmlToList(x)

    t <- (lst$DisorderList
             $Disorder
             $ClassificationNodeList
             $ClassificationNode
             $ClassificationNodeChildList[5]
             $ClassificationNode
             $Disorder
             $Name
             $text)

    return(t)
}, simplify = FALSE)


# OUTPUT ELEMENTS BY NAME
xmls$en_product3_146.xml
xmls$en_product3_147.xml
xmls$en_product3_148.xml
...