依赖于输入的闪亮app填充输出不起作用

时间:2016-12-21 13:08:14

标签: r shiny shiny-server

我正在进行一些文本挖掘。根据用户的输入,我正在为下一个单词生成一些建议。这部分工作正常。然而,建议的数量可能非常大,所以我想在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()))])

我迷路了。我变得如此绝望,以至于我尝试了一些我不希望工作的东西。 有可能做我想要的吗?如果是这样,怎么样?如果没有,问题是什么?我还没有找到解决这个特定问题的任何内容。

1 个答案:

答案 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做了什么,但它们似乎非常适合这样的情况。