Команда KWIC выдает ошибку: объект ‘docname’ не найден

#r #shiny #quanteda

#r #блестящий #квантовая

Вопрос:

Я создал панель мониторинга с помощью R-shiny. Пользователь введет слово, оно передается команде KWIC, а выходные данные отображаются в виде таблиц на главной панели.

Если слово существует, оно покажет таблицу, если нет, оно выдаст соответствующую ошибку, как определено в блоке проверки. Но когда я передаю слово «abcdef», оно выдает ошибку: объект ‘docname’ не найден. я не знаю, что неправильно я здесь делаю.

 table1 <- eventReactive((input$submit_kwic),
subset(kwic(corpus1, pattern = c(input$word1), case_insensitive = TRUE, window = 20), select = c(docname, pre, keyword, post)))
  
 output$tab1 <- renderTable({

    if (input$submit_kwic== 0){return()}      
    else{
      isolate({
        validate(
          need(input$word1 !='',"No table output shown as word 1 is not supplied"),
          need(sum(grepl(input$word1, x = attr(tokens_wo_stp, "types"))) >= 1,"Word does not exist in vocabulary, try another word!")
        )
        table1()
      })
    }}, striped = TRUE, hover = TRUE, bordered = TRUE)
  

Фрагмент показывает ошибку

Ответ №1:

Я не смог воспроизвести вашу ошибку. Я полагаю, что ошибка: объект ‘docname’ не найден указывает на то, что subset() не использует нестандартную оценку (по какой-то причине) и ищет объект с именем docname вместо того, чтобы распознать, что вам нужен столбец с именем docname. Чтобы перестраховаться, я бы привел имена столбцов в кавычки.

Другая проблема, с которой я столкнулся, заключается в том, что quanteda я думаю, что он пытается использовать свой собственный метод подмножества. Вы можете использовать метод подмножества для data.frame объектов, сначала преобразовав объект kwic. Объекты kwic, насколько я знаю, обычные data.frame , за исключением дополнительного класса «kwic». Заключая kwic() в as.data.frame() , вы заставляете R использовать data.frame метод подмножества, который делает то, что вы хотите.

Вот возможное решение, включающее воспроизводимые данные (вы всегда должны включать воспроизводимые данные в свои вопросы, поскольку это облегчает их ответ и понимание).

 library(quanteda)

corpus1 <- corpus(c("I have created a dashboard using R-shiny. User will enter a word , it gets passed to KWIC command and output is displayed as tables in the main panel."))

input <- data.frame(word1 = "dashboard",
                    stringsAsFactors = FALSE)

subset(as.data.frame(kwic(corpus1, pattern = c(input$word1), 
                          case_insensitive = TRUE, 
                          window = 20)), 
       select = c("docname", "pre", "keyword", "post"))
  

Я не проверял остальную часть вашего кода, поскольку subset строка, похоже, является источником вашей проблемы. Но трудно сказать, поскольку без полного блестящего кода я не могу воспроизвести ваше приложение.

Комментарии:

1. Действительно, строка подмножества создает проблему. Но я думаю, что может быть проблема с моим условием, sum(grepl("def", x = attr(tokens_wo_stp, "types"))) >= 1 потому что оно показывает TRUE и в tokens_wo_stp нет слова «def»

2. Я не понимаю эту функцию. Что такое tokens_wo_stp ? Если вы хотите проверить, kwic возвращает ли что-либо, вы можете использовать, shiny::need(nrow(table1) > 0 , "Word does not exist in vocabulary, try another word!") где table1 это выходные данные строки subset kwic .

3. tokens_wo_stp это маркированная версия моего корпуса, о которой я должен был упомянуть ранее. Если используется need(nrow(table1) > 0 , оно отображает Word does not ... каждый раз, даже если слово присутствует в tokens_wo_stp . Когда я использовал need(sum(grepl(input$word2, x = attr(tokens_w_stp, "types"))) >= 1,"Word does not exist in vocabulary, try another word!") , он в основном сообщает вам, встречается ли слово 1 или более. Если True , отобразите вывод kwic, иначе возникнет ошибка. Но он также обнаруживал частично, например: он обнаруживал «def» в «дефиците».

4. Итак, я поставил граничные условия, grepl(pattern = paste("\b", input$word2, "\b", sep = ""), x = attr(tokens_w_stp, "types") и теперь все работает гладко. Нет ошибок, кроме тех, которые определены в блоке проверки необходимости.

Ответ №2:

Проблема в том, что вы удалили столбцы из объекта kwic с помощью вызова subset(x, select = ...) , а затем в renderTable() вызове строка table1() возвращает подмножество kwic объекта, который вызывает kwic.print() . Этот метод предполагает, что определенные столбцы присутствуют, например docname , но их нет, потому что вы удалили их с помощью поднабора столбцов ( subset() вызов).

Это должно исправить: замените строку

         table1()
  

с

         print.data.frame(table1())
  

Я отправил проблему для этого наhttps://github.com/quanteda/quanteda/issues/1665 и, надеюсь, мы скоро это исправим, так что этот обходной путь не нужен. (Но это обходное решение всегда должно работать.)

Комментарии:

1. Пробовал, но безуспешно. Мне интересно, почему это происходит для определенных слов, а не для всех. Как вы можете видеть, вывод слов от 2 до 5 в порядке. Если я передаю слова «abcdef» или «def» в любой из 5 входных данных, он выдает ошибку ‘docname’ not found. Он показывает пустую таблицу, если я удаляю select= c(.....) из подмножества.

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