在 R shinydashboard 中设置链接函数的初始值

Setting initial values for a linked function in R shinydashboard

解决了我最初创建链接 sliderInput()numericInput() 的问题,但是当我实施此解决方案时,我收到一条错误消息,声称默认 value 尚未设置,这意味着 sliderInput() 不会呈现。

只要您在 numericInput() 中更改或输入一个数字,整个事情就会开始正确呈现,所以一旦 valueupdateSliderInput()updateNumericInput() 函数。

我想不明白的是如何设置初始值?

下面复制了该问题的代码。

"ui.R"

library(shiny)

shinyUI(fluidPage(

  uiOutput("Param_s"),
  uiOutput("Param_n")

))

"server.R"

library(shiny)

shinyServer(
function(input,output,session) {

# Mutually dependent  slider and numeric inputs 
output$Param_s = renderUI({
sliderInput(inputId = "param_slide",
            label= "My input parameter",
            value= input$param_numeric,
            min=1,
            max=200)
})

output$Param_n = renderUI({
numericInput(inputId = "param_numeric",
             label= "My input parameter",
             value= input$param_slide,
             min=1,
             max=200)
})

updateSliderInput(session,"param_slide", value = 60)
updateNumericInput(session,"param_numeric", value = 60 )

})

这是一种将它们联系起来的巧妙方法。我已经用 observeEvent 函数完成了它,它非常笨拙。

至于这个问题,我认为是第一次创建滑块的时候没有input$param_value造成的

您可以将滑块的值行替换为:

value= if(!is.na(input$param_numeric)){input$param_numeric}else{60}

这对我有用,让你在最后摆脱你的更新语句。虽然对我来说你的实际代码似乎也有效,但它在控制台中给出了一条错误消息。

--

编辑:我搞错了。无论哪种方式,它都对我有用,我回答中的 if 语句没有帮助。我的 if 版本适用于 exists:

value= if(exists('input$param_numeric')){input$param_numeric}else{60}

但是考虑到你的原始代码对我有用,这并不能证明什么

如果可能,您应该尽量避免re-rendering。更新现有输入更快:

library(shiny)

ui <- fluidPage(
  sliderInput(
    inputId = "param_slide",
    label = "My input parameter",
    value = 60,
    min = 1,
    max = 200
  ),
  numericInput(
    inputId = "param_numeric",
    label = "My input parameter",
    value = 60,
    min = 1,
    max = 200
  )
)

server <- function(input, output, session) {
  observeEvent(input$param_numeric, {
    updateSliderInput(session, "param_slide", value = input$param_numeric)
  }, ignoreInit = TRUE)
  observeEvent(input$param_slide, {
    updateNumericInput(session, "param_numeric", value = input$param_slide)
  }, ignoreInit = TRUE)
}

shinyApp(ui, server)

顺便说一句。在 shiny 中使用 inter-related 输入,你就像在如履薄冰。 请参阅 this and this