【问题标题】:R Shiny: How can I reference reactive elements in renderUI through uiOutput() in server function?R Shiny:如何通过服务器函数中的 uiOutput() 引用 renderUI 中的反应元素?
【发布时间】:2017-09-29 12:20:09
【问题描述】:

我试图让一个 UI 元素与另一个元素发生反应,然后测试第一个元素是否等于一个特定值。我似乎能够打印出反应元素的值,但我不能在 if 语句中使用它来检查它的值。代码如下。我已经注释掉了第 23 行周围的麻烦部分。它在注释掉的行的情况下运行,并验证反应元素 input$paramRes1 确实具有 1 - 5 之间的整数字符值,正如预期的那样,但是当我取消注释时检查该整数值是否为 1 的行,它告诉我 input$paramRes1 为空。确切的错误是:

Warning:
Error in if: argument is of length zero
Stack trace (innermost first):
59: observerFunc [#16]
 4: <Anonymous>
 3: do.call
 2: print.shiny.appobj
 1: <Promise>

为什么它会告诉我 input$paramRes1 为空,当它打印为一个字符时?还是我误读了错误?感谢您的帮助!

suppressWarnings(library(shiny))
suppressWarnings(library(shinyFiles))
    ui <- function(request) {
    fluidPage(
        uiOutput("param1"),
        uiOutput("param2"),
        fluidRow(column(12, verbatimTextOutput("value", placeholder = T)))
    )
}

server <- function(input, output, session) {
    state = reactiveValues()

    observe({
          state$choice <- setNames(as.list(c(1, 2, 3, 4, 5)), c("First", "Second",
            "Third", "Fourth", "Fifth"))
    })
    output$param1 <- renderUI({
        selectInput("paramRes1", "Select Param 1", state$choice, selected = 1)
    })
    output$param2 <- renderUI({
        textInput("paramNm", "Param", value = input$paramRes1, width = '150px')
    })

    observe({
      #  if (input$paramRes1 %in% 1) {
            state$val <- input$paramRes1
      #  } else {
      #      state$val <- 0
      #  }

    })

    output$value <- renderText({ str(state$val) })
}
shinyApp(ui = ui, server = server)

【问题讨论】:

  • 能否请您编辑您的代码,以便您的示例代码可重现?我注意到,无论你有state$"var",它都应该被称为函数state()$"var" ...这可能与你的问题无关,但你没有包含足够的内容让我们使用
  • 在闪亮的情况下,input 变量始终使用值 NULL 进行初始化,因此您的服务器逻辑应该能够处理它。使用observeEvent 而不是observe 适用于您的示例,因为observeEvent 默认情况下会忽略空值。
  • 当我通过 observeEvent(input$paramRes1, { if (input$paramRes1 %in% "1") { state$val
  • 我是否以这种方式滥用 obeserveEvent(),期望当 input$paramRes1 初始化为 NULL 时,input$paramRes1 值的变化(通过 UI 的变化)应该导致重新评估(input$paramRes1 %in% "1") 的条件?

标签: r shiny


【解决方案1】:

这是您的应用程序的(略微)简化版本,其中包含我在 cmets 中建议的修复

library(shiny)

ui <- fluidPage(
  uiOutput("param1"),
  uiOutput("param2"),
  fluidRow(column(12, verbatimTextOutput("value", placeholder = T)))
)

server <- function(input, output, session) {
  state = reactiveValues(choice = list(
    first = 1, second = 2, third = 3, fourth = 4, fifth = 5
  ))
  output$param1 <- renderUI({
    selectInput("paramRes1", "Select Param 1", state$choice, selected = 1)
  })
  output$param2 <- renderUI({
    textInput("paramNm", "Param", value = input$paramRes1, width = '150px')
  })
  observeEvent(input$paramRes1,{
    if (input$paramRes1 %in% 1)
      state$val <- "It's 1"
    else
      state$val <- "It's not 1"
  })
  output$value <- renderText({ state$val })
}

shinyApp(ui = ui, server = server)

【讨论】:

  • 不客气。 TBH,我很困惑我在 cmets 中推荐的“快速修复”对你不起作用,但这个解决方案可以。我猜你在某处拼错了input$paramRes1
  • 实际上,我只是错误地在 if (input$paramRes1 %in% "1") 中添加了引号。一旦我删除了引号,它就会按照你的建议工作。再次感谢!
【解决方案2】:

以下方法可行吗?我只是在这里更改服务器部分。 ###### 之间的差异突出显示。

server <- function(input, output, session) {
  state = reactiveValues()

  observe({
    state$choice <- setNames(as.list(c(1, 2, 3, 4, 5)), c("First", "Second",
                                                      "Third", "Fourth", "Fifth"))
   })
  output$param1 <- renderUI({
    selectInput("paramRes1", "Select Param 1", state$choice, selected = 1)
  })
  output$param2 <- renderUI({
    textInput("paramNm", "Param", value = input$paramRes1, width = '150px')
  })

#####
  observeEvent(input$paramRes1, {
     if (input$paramRes1 == 1) {
     state$val <- input$paramRes1
      } else {
     state$val <- 0
      }
  })
###### 

   output$value <- renderText({ str(state$val) })
 }

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 2020-05-01
    • 2019-04-16
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2020-01-13
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多