取决于输入的闪亮应用程序填充输出不起作用

Posted

技术标签:

【中文标题】取决于输入的闪亮应用程序填充输出不起作用【英文标题】:Shiny app filling output that depends on input does not work 【发布时间】:2017-05-06 22:06:30 【问题描述】:

我正在做一些文本挖掘。根据用户的输入,我正在为下一个单词生成一些建议。这部分工作正常。但是建议的数量可能非常多,所以我想在 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") 中导致错误: 无法将类型“闭包”强制为“列表”类型的向量

     lapply(reactive(1:min(5,  length(words()))), function(i) 
              output[[paste0("suggestions", i)]] <- renderText( words()[i] )  )

在 as.vector(x, "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, reactive( : invalid 'type' (closure) of argument) 中导致错误

     lapply(1:min(5,  reactive( length(words() ))), function(i) 
             output[[paste0("suggestions", i)]] <- renderText( words()[i] ) ) 

在 min(5, reactive( : invalid 'type' (closure) of argument) 中导致错误

现在下面的行显示了在单个文本字段中输入的单词数。当我输入 2 时,它显示 2 个单词,当我输入 20 时,它显示 5 个单词。这是我想要的行为,但我希望每个单词都放在单独的文本字段中。

    output$suggestions1 <- renderText(words()[1:min(5, length(words()))])

我迷路了。我变得如此绝望,以至于我尝试了一些我没想到会起作用的事情。 有可能做我想做的事吗?如果是这样,怎么做?如果不是,问题是什么?我还没有找到任何解决这个特定问题的方法。

【问题讨论】:

看起来很有趣,但我现在没有时间解决它。也许今晚晚些时候。 尝试简单地编码它,没有任何 lapplys 然后合并。并查看 Shiny Cheat sheet #3。执行模型,以确保您对 Shiny 执行的心理模型是正确的。我认为可能不是。 @MikeWise。我还尝试了 for 循环。也没有用。我认为这与混合renderreactive 语句的范围有关。我认为我之前尝试过的方式需要混合这些范围,这可能是不允许的。使用observe 有效。显然这是一个混合范围。 你知道外部 lapply 只执行一次,对吧? 啊,我明白你的意思了。感谢您的备忘单参考,这对我的心理发展很有帮助。外部 lapply 尝试或多或少出于绝望。由reactive 声明的一次也不起作用。 【参考方案1】:

outputUI 和 renderUI 的组合效果很好,并且使代码相对简单。

ui.R

    ...
    fluidRow(
            uiOutput("suggestions")
    )

服务器.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 的作用,但它们似乎非常适合此类情况。

【讨论】:

但是如果你将userText的值上下改变几次,它会起作用吗?不相信你不会得到一些不需要的定义。 还有来自 Shiny 主要架构师关于 Shiny 设计模式的精彩讲座:rstudio.com/resources/webinars/shiny-developer-conference @MikeWise。你说得对。上升没问题,但如果我输入一个较小的数字,它就不再起作用了。回到绘图板:(

以上是关于取决于输入的闪亮应用程序填充输出不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在闪亮的仪表板中使用 Ggplot 选择输入不起作用

在闪亮的应用程序中放置在 UiOutput 中时,缩放和重置控制器不起作用

闪亮的服务器会话超时不起作用

ggplot 和dashboardPage 的闪亮不起作用

闪亮的 DownloadHandler 在服务器上不起作用

在容器外加载数据时,dockerized 闪亮的应用程序不起作用