Невозможно изменить имена документов корпуса при использовании get () - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь изменить docnames списка corpus объектов через for-l oop. Обычно я использую функцию get() для доступа к данному объекту при перемещении по l oop. Кажется, я не могу сделать это в функции docnames() пакета quanteda . Я всегда получаю эту ошибку (условно для вашего входного объекта, который в моем случае listofcorpora):

Error in get(listofcorpora[i]) <- `*vtmp*` : 
  could not find function "get<-"

Пожалуйста, найдите ниже минимума с двумя корпусами. Изначально у меня есть еще много.

library(quanteda)
#> Package version: 2.0.0
#> Parallel computing: 2 of 8 threads used.
#> See https://quanteda.io for tutorials and examples.
#> 
#> Attaching package: 'quanteda'
#> The following object is masked from 'package:utils':
#> 
#>     View
library(stringr)

corp_2015_qtr1 <- corpus( c("The first document of the first corpus.",
                           "The second document of the first corpus" ) )
corp_2015_qtr2 <- corpus( c("The first document of the second corpus.",
                           "The second document of the second corpus" ) )

listofcorpora <- objects( pattern = "corp_\\d+" )

for ( i in seq_along( listofcorpora ) ) {
  current_year <- as.integer( str_extract( listofcorpora[ i ], "\\d+" ) )  current_qtr <- as.integer( str_extract( listofcorpora[ i ], "(?<=QTR)\\d" ) )
  current_docname <- str_c( current_year, 
                           "_qtr_", 
                           current_qtr, "_",
                           formatC( seq_len( ndoc( get( listofcorpora[ i ] ) ) ),
                                    width = 5, flag = "0" ) )
  docnames( get( listofcorpora[ i ] ) ) <- current_docname

}
#> Error in get(listofcorpora[i]) <- `*vtmp*`: could not find function "get<-"

Создано в 2020-04-15 с помощью пакета Представить (v0.3.0)

Одна и та же ошибка возникает, когда я использую docvars() таким же образом.

Спасибо!

1 Ответ

2 голосов
/ 15 апреля 2020

Я не знаю, откуда вы взяли файлы RData, но обычно имеет смысл сохранять объекты с помощью saveRDS и загружать их с помощью object <- readRDS, чтобы вы могли контролировать имя объекта или загружать файл непосредственно в список.

В вашем случае я бы превратил ваши объекты в список с помощью (как предложено @phiver в комментариях):

corpora_l <- lapply(listofcorpora, get)
names(corpora_l) <- listofcorpora

Чтобы получить более чистую среду, теперь вы можете удалить лишние объекты:

# remove unnecessary objects
rm(list = c(listofcorpora, "listofcorpora"))

Работа с этим списком в моем мнении кажется более простой и более важной: docnames() работает с объектами списка:

for (i in seq_along(corpora_l)) {
  current_name <- names(corpora_l)[i]
  current_year <- as.integer( str_extract( current_name, "\\d+" ) )  
  current_qtr <- as.integer( str_extract( current_name, "(?<=qtr)\\d" ) )
  current_docname <- str_c( current_year, 
                            "_qtr_", 
                            current_qtr, "_",
                            formatC( seq_len( ndoc( corpora_l[[i]] ) ),
                                     width = 5, flag = "0" ) )
  docnames( corpora_l[[i]] ) <- current_docname
}

Также: я не знаю каков ваш план относительно docnames, но кажется, что year-qtr - это скорее переменная документа. Таким образом, вы могли бы изменить последнюю строку в l oop на:

docvars(corpora_l[[i]], field = "quarter") <- str_c(current_year, 
                                                    "_qtr_", 
                                                    current_qtr)

Извините, что я вырезал ваш стиль там. Я не привык к количеству пробелов, которые вы оставляете в своем коде.

...