Команда KWIC выдает ошибку: объект 'docname' не найден - PullRequest
0 голосов
/ 03 апреля 2019

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

Если слово существует, оно покажет таблицу, если нет - выдаст соответствующую ошибку, как определено в блоке проверки.Но когда я передаю слово "abcdef", оно выдает Ошибка: объект 'имя документа' не найден. Я не знаю, что не так, я делаю здесь.

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)

Snippet shows the error

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

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

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

        table1()

с

        print.data.frame(table1())

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

0 голосов
/ 03 апреля 2019

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

Другая проблема, с которой я столкнулся, заключается в том, что quanteda пытается использовать собственный метод подмножеств, как мне кажется.Вы можете использовать метод subset для data.frame s, сначала преобразовав объект kwic.Насколько я знаю, объекты kwic являются обычными data.frame s, за исключением дополнительного класса "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, по-видимому, является источником вашей проблемы.Но трудно сказать, так как без полного блестящего кода я не могу воспроизвести ваше приложение.

...