我正在进行一些文本挖掘。根据用户的输入,我正在为下一个单词生成一些建议。这部分工作正常。然而,建议的数量可能非常大,所以我想在Shiny中显示最多10条建议,我不想显示NA值。
我创建了一个可重现的示例来展示同样的问题。我正在尝试使用的技巧是用i粘贴“建议”。这在我的输出不依赖于我的输入时有效。我是从http://shiny.rstudio.com/gallery/creating-a-ui-from-a-loop.html得到的。
我的ui.R文件
library(shiny)
fluidPage(
titlePanel("Test"),
fluidRow(
textAreaInput("userText", label="Enter your text")
),
fluidRow(
lapply(1:5, function(i) {
textOutput(paste0("suggestions", i))})
)
)
我的服务器.R
library(shiny)
mySuggestions <- c("this", "is", "a", "test", "of", "getting", "reactive", "list", "length")
function(input, output, session) {
getWords <- function(i, wrds) {
output[[paste0("suggestions", i)]] <- renderText({ wrds()[i] })
}
userText <- reactive({
# Leaves this function when input$userText is NULL or ""
req(input$userText)
input$userText })
words <- reactive({
mySuggestions[1:userText()]
})
# Problem
lapply(reactive({ 1:min(5, length(words())) }), getWords(), wrds=words())
}
当您在ui文本字段中输入正整数时,应用应显示尽可能多的单词,但最多只能显示5个。
上述版本的server.R会出现警告“警告:paste0中的错误:参数”i“缺失,没有默认值” 我已经为这个有问题的线尝试了几个版本。
reactive({ lapply(1:min(5, length(words())), getWords(), wrds=words() ) })
没有错误,但在输出中没有显示任何内容。
lapply(1:min(5, length(words())), getWords() , wrds=words())
结果出现警告“警告:paste0中的错误:参数”i“缺失,没有默认值”
lapply(reactive({1:min(5, length(words()))}), getWords(), wrds=words())
结果出现警告“警告:paste0中的错误:参数”i“缺失,没有默认值”
lapply(reactive({1:min(5, length(words))}), function(i) {
output[[paste0("suggestions", i)]] <- renderText({ words[i] }) } )
as.vector中出现错误(x,“list”): 不能强制类型'封闭'类型为'list'
类型的向量 lapply(reactive({1:min(5, length(words()))}), function(i) {
output[[paste0("suggestions", i)]] <- renderText({ words()[i] }) } )
as.vector中出现错误(x,“list”): 不能强制类型'封闭'类型为'list'
类型的向量 reactive({lapply(1:min(5, length(words)), function(i) {
output[[paste0("suggestions", i)]] <- renderText({ words[i] }) }) })
没有错误,但在输出中没有显示任何内容。
reactive({lapply(1:min(5, length(words())), function(i) {
output[[paste0("suggestions", i)]] <- renderText({ words()[i] }) }) })
没有错误,但在输出中没有显示任何内容。
lapply(1:min(5, reactive({ length(words )})), function(i) {
output[[paste0("suggestions", i)]] <- renderText({ words[i] }) })
导致min的错误(5,反应({:无效'类型''(闭包)参数
lapply(1:min(5, reactive({ length(words() )})), function(i) {
output[[paste0("suggestions", i)]] <- renderText({ words()[i] }) })
导致min的错误(5,反应({:无效'类型''(闭包)参数
现在,以下行显示单个文本字段中输入的单词数。当我输入2时,它显示2个单词,当我输入20时,它显示5个单词。这是我想要的行为,但我希望每个单词都在一个单独的文本字段中。
output$suggestions1 <- renderText(words()[1:min(5, length(words()))])
我迷路了。我变得如此绝望,以至于我尝试了一些我不希望工作的东西。 有可能做我想要的吗?如果是这样,怎么样?如果没有,问题是什么?我还没有找到解决这个特定问题的任何内容。
答案 0 :(得分:1)
outputUI和renderUI的组合效果很好,并且使代码相对简单。
ui.R
...
fluidRow(
uiOutput("suggestions")
)
server.R
library(shiny)
mySuggestions <- c("this", "is", "a", "test", "of", "getting", "reactive", "list", "length")
function(input, output, session) {
...
output$suggestions <- renderUI({
lapply(1:min(5, length(words())), function(i) {
output[[paste0("suggestions", i)]] <- renderText({ words()[i] })
}) })
}
我不知道outputUI和renderUI做了什么,但它们似乎非常适合这样的情况。