#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. Я предположил, но это было только предположение, без воспроизводимого примера я не могу диагностировать вашу проблему.