根据无功输出值设置最大滑块输入值

Posted

技术标签:

【中文标题】根据无功输出值设置最大滑块输入值【英文标题】:Set maximum sliderInput value based on reactive output value 【发布时间】:2017-01-23 21:16:58 【问题描述】:

我有一个带有滑块输入的 Shiny 应用程序,我想根据用户上传的数据集中的最大值设置滑块的最大可能值。最大距离会根据上传的数据集而变化。

这是我正在尝试做的最小工作示例。下面我只是硬编码了最大距离的数字,但在我的代码中它是计算出来的:

library(shiny)

ui <- fluidPage(
  sliderInput("range_one", "Core:", min = 0, max = textOutput("maxdistance"), value = c(0,0))
)

server <- function(input,output) 
   output$maxdistance <- renderText( 
    maxdistance <- 250
    return(maxdistance)
  )


shinyApp(ui=ui,server=server)

我收到以下错误:

Error in max - min : non-numeric argument to binary operator

这是有道理的,因为我要求一个文本输出,那么我如何将此输出作为一个数值用于 sliderInput() 函数?

【问题讨论】:

只需使用updateSliderInput 更新服务器端的滑块。 能否请您发布一个如何正确执行此操作的示例?我根据帮助尝试了一些方法,但它导致应用程序崩溃。 @user29609,检查这个:***.com/a/38376629/1247080 【参考方案1】:

这是一个例子。

library(shiny)

ui <- shinyUI(fluidPage(

  titlePanel("Example"),

  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30),
      actionButton("change", "Change slider max value")
    ),

    mainPanel(
      plotOutput("distPlot")
    )
  )
))

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

  observeEvent(input$change, 
    max = sample(50:100, 1)
    updateSliderInput(session, "bins", max=max)
  )

  output$distPlot <- renderPlot(
    x <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  )
)

shinyApp(ui = ui, server = server)

【讨论】:

谢谢!我能够根据您的回答制作一个工作示例,但我现在的麻烦是尝试从 observe() 函数中的反应函数访问我的计算值。我可以对其进行硬编码,例如 max=250,或使用 max = sample(50:100,1),但我似乎无法访问存储在数据框中的计算数据。我试过:data 呵呵,看来动作按钮是必须的。如果我添加它,它不会崩溃。我认为应用程序崩溃了,因为它依赖于上传的数据来获取最大值,所以我们需要保持默认值,直到数据上传,然后单击更改滑块最大值。非常感谢!【参考方案2】:

如下修改,即可:

sliderInput("range_one", "Core:", 
            min = 0, max = as.integer(textOutput("maxdistance")), 
            value = c(0,0))

【讨论】:

谢谢,但这给出了错误: findStepSize(min,max,step) (list) object cannot be coerced to type 'integer' 中的错误 您是否使用完全相同的代码,只更新了这一行?这个对我有用。您正在从 renderText 返回 maxdistance(这是一个初始化为 250 的整数)对吗?【参考方案3】:

这是我在服务器端使用的代码,用于实现原始问题的预期结果,无需操作按钮:

observe(
infile <- input$file # user input file upload
 if(!is.null(infile)) 
  processed <- processed() # list of processed elements returned from earlier reactive() function with my app
  processed_data <- processed$processed_data # get the processed data from the list and save as data frame
  maxdistance <- max(processed_data$distance) # calculate the max distance from the processed data
  updateSliderInput(session, "range_one", max=maxdistance) # update the slider called "range_one" based on the maxdistance
  

)

这允许应用在上传文件之前使用默认的最大滑块值。一旦用户上传文件,数据就会被处理并更新滑块。

【讨论】:

以上是关于根据无功输出值设置最大滑块输入值的主要内容,如果未能解决你的问题,请参考以下文章

根据计算的值 [Swift] 使用滑块更改 TextField 中的值

给定输入范围受限的输出值公式 - 滑块 UI

是否可以根据其他表单的输入来更改 HTML5 范围滑块的最小值和最大值?

我可以设置 Shiny 应用程序启动时滑块输入的最小值和最大值吗?

使用inputBox的输出作为R Shiny中inputSlider的输入

java输出最大值和最小值