gpt4 book ai didi

带有条件面板和 react 器的 R Shiny 模块

转载 作者:行者123 更新时间:2023-12-04 03:56:55 28 4
gpt4 key购买 nike

我正在尝试模块化一个复杂的 Shiny 应用程序,我有一个 conditionalPanel这应该只出现在特定的输入状态。

在我将所有内容模块化之前,输入和条件面板都在 ui.R 中,我可以使用如下方式引用输入:

conditionalPanel("input.select == 'Option one'", p('Option one is selected'))

现在我已经模块化了东西,访问输入更加复杂。我认为以下是做到这一点的方法,但它并不完全奏效。 (这里我把东西组合成一个独立的脚本):
library(shiny)

## Module code for 'selectorUI' and 'selector'
selectorUI <- function(id) {
ns <- NS(id)
selectizeInput(inputId = ns('select'),
label = 'Make a choice:',
choices = c('Option one', 'Option two'))
}

selector <- function(input, output, session) {
reactive(input$select)
}

## Main app
ui <- shinyUI(fluidPage(
selectorUI('id1'),
conditionalPanel(condition = "output.selected == 'Option one'", p('Option one is selected.'))
))

server <- shinyServer(function(input, output, session) {
output$selected <- callModule(selector, 'id1')
})

shinyApp(ui = ui, server = server)

我认为这应该有效,但它没有——它只有在我再次引用 output$selected 时才有效。在主用户界面部分:
ui <- shinyUI(fluidPage(
selectorUI('id1'),
textOutput('selected'), ## Adding just this one line makes the next line work
conditionalPanel(condition = "output.selected == 'Option one'", p('Option one is selected.'))
))

不幸的是,这当然会产生渲染 textOutput('selected') 的结果的不良影响。 .我只能猜测它起作用的原因是因为它以某种方式触发了响应式,而 JavaScript 引用本身不会。

知道我应该如何让这个 conditionalPanel 正常工作吗?

谢谢..

编辑:原来实际上不是一个错误: https://github.com/rstudio/shiny/issues/1318 .请参阅下面我自己的答案。

但还要注意,我实际上喜欢 renderUI接受的答案中给出的解决方案比我原来的 conditionalPanel 更好方法。

最佳答案

调用模块后ID为selectizeInputid1-select .在 javaScript 中有两种访问对象属性的方法:
objectName.propertyobjectName['property']
由于有-ID我们必须通过字符串来引用它,所以第二种方法是可行的。
conditionalPanel 中的条件变成:

input['id1-select'] == 'Option one'

完整示例:
library(shiny)

## Module code for 'selectorUI' and 'selector'
selectorUI <- function(id) {
ns <- NS(id)
selectizeInput(inputId = ns('select'),
label = 'Make a choice:',
choices = c('Option one', 'Option two'))
}

## Main app
ui <- shinyUI(fluidPage(
selectorUI('id1'),
conditionalPanel(condition = "input['id1-select'] == 'Option one'",
p('Option one is selected.'))
))

server <- shinyServer(function(input, output, session) {

})

shinyApp(ui = ui, server = server)

编辑:

This does work, but doesn't it violate the notion of modularity? You would have to know the code for the module internally calls that input 'select' in order to construct 'id1-select'.



你是对的。

据此 article ,您使用的技巧,即将模块调用分配给 output$selected 然后通过 output.selected 在客户端访问其值应该工作,但它没有。我不知道为什么......这可能是一个错误。 (我有来自 github 的最新 Shiny 版本)

我唯一能想到的就是使用 renderUI而不是 conditionalPanel如下例所示:
library(shiny)
## Module code for 'selectorUI' and 'selector'
selectorUI <- function(id) {
ns <- NS(id)
selectizeInput(inputId = ns('select'),
label = 'Make a choice:',
choices = c('Option one', 'Option two'))
}

selector <- function(input, output, session) {
reactive(input$select)
}

## Main app
ui <- shinyUI(fluidPage(
selectorUI('id1'),
uiOutput("dynamic1")
))

server <- shinyServer(function(input, output, session) {


output$dynamic1 <- renderUI({
condition1 <- callModule(selector, 'id1') # or just callModule(selector, 'id1')()
if (condition1() == 'Option one') return(p('Option one is selected.'))
})

})

shinyApp(ui = ui, server = server)

关于带有条件面板和 react 器的 R Shiny 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39109671/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com