【问题标题】:Assigning values to an input before it is created在创建输入之前为其赋值
【发布时间】:2020-11-11 12:46:16
【问题描述】:

注意:下面的第一个示例不是特别清楚 - 我在下面添加了另一个示例,它更清楚地解释了所需的行为。

我正在构建的应用程序遇到了一个稍微棘手的问题。我正在使用uiOutput 动态渲染一系列radioButtons。但是,我需要在创建它们之前为输入分配值。我认识到这可能没有意义,但在我的实际用例中,我认为没有其他方法。

在下面的示例中,我想创建三个输入,input$mpginput$hpinput$disp,并为它们分别分配一个值 yes在生成 UI 之前。然后,当生成 UI 时,我想用所选值替换这些默认值。请注意,在下面的示例中,我包含了一个 actionButton 以防止这些输入立即被 UI 创建。

任何人都可以提出一种方法来实现这一点吗?

library(shiny)

var_names <- c("mpg", "hp", "disp")

ui <- fluidPage(
  actionButton("go", "Go!"),
  uiOutput("var_type")
)

server <- function(input, output, session) {
  observeEvent(input$go, {
    output$var_type <- renderUI({
      var_names %>% map(~radioButtons(inputId = .x,
                                      label = .x,
                                      choices = c("Yes", "No")))
    })
  })
}

shinyApp(ui, server)

编辑:提高清晰度的新示例

我正在使用uiOutput 动态渲染三个radioButtons。这些单选按钮的值将连接成一个字符串并呈现在textOutput“值”中。但是,这三个单选按钮及其关联输入仅在单击操作按钮Go! 后生成。

在单击 actionButton 并呈现单选按钮及其相关输入之前,我仍然希望使用这些输入的一组默认值来呈现 textOutput。我想为三个输入中的每一个分配默认值yes。这是我的问题的根本原因,因为我想在点击Go! 按钮之后实际输入之前创建一个占位符输入并为其分配一个值。

在单击 Go! 之前,我希望 textOutput values 显示“Yes Yes Yes”,因为这些是前面提到的默认值。但是,在单击Go! 并呈现单选按钮后,textOutput“值”应该响应这些变化的输入。例如,如果单击 Go 后,mpg 的按钮更改为“否”,则文本将显示为 No Yes Yes

library(shiny)

var_names <- c("mpg", "hp", "disp")

ui <- fluidPage(
  actionButton("go", "Go!"),
  uiOutput("var_type"),
  textOutput("values")
)
  
server <- function(input, output, session) {
  observeEvent(input$go, {
    output$var_type <- renderUI({
      var_names %>% map(~radioButtons(inputId = .x,
                                      label = .x,
                                      choices = c("Yes", "No")))
    })
  })
  output$values <- renderText({
    paste(input$mpg, input$hp, input$disp)
  })
}

shinyApp(ui, server)

【问题讨论】:

  • 那你为什么不直接把它们放到fluidPage() 中呢?我真的不明白您要在这里创建什么行为。
  • 在实际用例中,变量选择依赖于上传的表,所以我无法在ui中提前定义它们,因为直到用户上传我才知道它们是什么某事
  • 另外,在渲染单选按钮之前,我需要在服务器端的其他操作中使用默认值
  • 对不起,这对我来说仍然没有意义。您希望从可重现的示例中获得什么行为?我需要测试什么才能验证它是否按您喜欢的方式工作?
  • 如果第一个示例不清楚并且没有清楚地解释您的问题,为什么不完全删除它并只保留帖子中的编辑部分。

标签: r shiny


【解决方案1】:

也许你正在寻找这个

library(shiny)

var_names <- c("mpg", "hp", "disp")

ui <- fluidPage(
  actionButton("go", "Go!"),
  uiOutput("var_type"),
  textOutput("values")
)

server <- function(input, output, session) {
  observeEvent(input$go, {
    output$var_type <- renderUI({
      var_names %>% map(~radioButtons(inputId = .x,
                                      label = .x,
                                      choices = c("Yes", "No")))
    })
  })
  output$values <- renderText({
    if (is.null(input$mpg))  val1 = "Yes" else val1 = input$mpg
    if (is.null(input$hp))   val2 = "Yes" else val2 = input$hp
    if (is.null(input$disp)) val3 = "Yes" else val3 = input$disp
    paste(val1, val2, val3)
  })
}

shinyApp(ui, server)

【讨论】:

  • 实际用例比简单地插入这些值更复杂。不过很感激!
  • 或者,您可以使用if (input$go &lt;1) paste("Yes","Yes","Yes") else paste(input$mpg, input$hp, input$disp)。如果没有更多详细信息,我不确定我们能否为您的用例提供更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多