在 R shinydashboard 中设置链接函数的初始值
Setting initial values for a linked function in R shinydashboard
解决了我最初创建链接 sliderInput()
和 numericInput()
的问题,但是当我实施此解决方案时,我收到一条错误消息,声称默认 value
尚未设置,这意味着 sliderInput()
不会呈现。
只要您在 numericInput()
中更改或输入一个数字,整个事情就会开始正确呈现,所以一旦 value
被 updateSliderInput()
和 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。
sliderInput()
和 numericInput()
的问题,但是当我实施此解决方案时,我收到一条错误消息,声称默认 value
尚未设置,这意味着 sliderInput()
不会呈现。
只要您在 numericInput()
中更改或输入一个数字,整个事情就会开始正确呈现,所以一旦 value
被 updateSliderInput()
和 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。