l oop для присвоения имен новым объектам на основе списка в r - PullRequest
0 голосов
/ 28 февраля 2020

Я новичок в чтении xml файлов, и я застрял, пытаясь присвоить новым объектам имена среды после преобразования их в список.

Я прочитал 35 файлов каталога и проанализировал их с xmlParse, из XML упаковки. Их я преобразовал в список.

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)}

Я бы быть очень благодарным с некоторыми советами. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Пересмотрите сохранение отдельных многих объектов, заполняющих вашу глобальную среду. Вместо этого сохраняйте подобные структурированные объекты в списке для индексируемого поиска и последовательной обработки. Таким образом, вместо 35 управляемых объектов вы управляете только одним объектом из 35 элементов.

Для таких структур, построенных на основе итеративной обработки, рассмотрите lapply или оболочку sapply, поскольку она сохраняет имена. Семейство apply - это скрытые циклы, которые возвращают объект (ы) с равной длиной в качестве входных данных:

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
...
1 голос
/ 28 февраля 2020

Вам может понадобиться сначала использовать 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()

Обратите внимание, что с этим кодом у вас будет два объекта с разными именами, но с одинаковым содержимым.

...