我使用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)))
答案 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提出了一个问题,希望我们能尽快解决它,这样就不需要此解决方法了。 (但是此替代方法应始终有效。)