KWIC命令抛出错误:找不到对象“文档名”

时间:2019-04-03 07:52:45

标签: r shiny quanteda

我使用R-shiny创建了一个仪表板。用户将输入一个单词,该单词将传递给KWIC命令,并且输出将在主面板中显示为表格。

如果单词存在,它将显示该表,如果不存在,它将抛出validate块中定义的相应错误。但是,当我传递单词“ abcdef”时,它抛出错误:找不到对象“ docname”。我不知道我在这里做什么错。

clang++ -std=c++11 fourd.cpp
table1 <- eventReactive((input$submit_kwic),
subset(kwic(corpus1, pattern = c(input$word1), case_insensitive = TRUE, window = 20), select = c(docname, pre, keyword, post)))

Snippet shows the error

2 个答案:

答案 0 :(得分:0)

我无法重现您的错误。我相信错误:未找到对象'docname'表示subset()未使用非标准评估(出于某种原因),并且正在寻找名为docname的对象,而不是识别出您想要的名为docname的列。为了安全起见,我会引用列名。

我遇到的另一个问题是quanteda正在尝试使用我认为的自己的子集方法。通过首先转换kwic对象,可以将data.frame的子集方法使用。据我所知,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 :(得分:0)

问题是您通过调用subset(x, select = ...)从kwic对象中删除了列,然后在renderTable()调用中,行table1()返回了子集kwic调用kwic.print()的对象。此方法假定存在某些列,例如docname,但不是因为您已使用列子集(subset()调用)将其删除。

这应该解决它:替换行

        table1()

使用

        print.data.frame(table1())

我为此在https://github.com/quanteda/quanteda/issues/1665提出了一个问题,希望我们能尽快解决它,这样就不需要此解决方法了。 (但是此替代方法应始终有效。)