首页 > 解决方案 > 为交互式闪亮小部件参数制作反应变量

问题描述

我想制作由名为“kit”的组规范子集的权重数据集(df)的直方图。该应用程序应该有一个操作按钮来提交一个文本输入字段以指定数据集的套件分组和一个 2 路 Inputslider,最终将在直方图上显示两条垂直线。因为重量范围因套件而异,所以我希望滑块输入边界是交互式的,更新为稍微超出子集数据集的最小和最大权重。

我尝试使用 ui 函数中的 uiOutput 调用来实现它,并通过使用 reactiveValues 选项创建反应变量来更新小部件和直方图参数,例如本示例Update sliderInput in Shiny reactively

界面功能

library(tidyverse)
library(stringr)
library(dplyr)
library(ggplot2)
library(shiny)

df =  data.frame(list(x = rnorm(20), y = rnorm(20,5,3), z = rnorm(20,5,.4) )) %>% gather(key = 'kit', value = 'weight')

ui <- fluidPage(

  sidebarLayout(
    sidebarPanel(
      em('Select a kit and a weight range for it.'),
      textInput('kit', strong('Enter Kit Number'), value='107066'),
      actionButton('kitSelect','Select Kit'),
      uiOutput('slider'),
      sliderInput('bins','Number of Bins', min = 5, max = 30, val= 15)
     ),
    mainPanel(
      plotOutput('hist')
      )
    )
  )

服务器功能:


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

    kitSelect = reactiveValues()  

    observeEvent(input$kitSelect, {
      #subset data by kit
      kitSelect$histdf = df %>% filter( kit == input$kit)  %>% select(weight)
      weightrange = range(kitSelect$histdf)[2] - range(kitSelect$histdf)[1]
      #min and max parameters for slider buttons
      kitSelect$a =  range(kitSelect$histdf)[1] - weightRange*.1
      kitSelect$b = range(kitSelect$histdf)[2] + weightRange*.1

      #bin width for histogram
      kitSelect$width = (b-a)/input$bins
    })

    output$slider = renderUI({
      sliderInput('slider', 'Kit Range', min = kitSelect$a, max = kitSelect$b, value = c(kitSelect$a, kitSelect$b))
    })
    output$hist= renderPlot({

      ggplot(kitSelect$histdf, aes(x= weight)) + 
      geom_histogram(color = 'blue', fill = 'blue', alpha = .5, binwidth = kitSelect$width) +
      stat_bin(aes(label = ..count../dim(dfHist)[1]), geom = 'text', vjust = -.5)+
      scale_x_continuous( breaks= seq(kitSelect$a, kitSelect$b, width)) +
      stat_function(fun=dnorm, n =501, args = list(mean = mean(kitSelect$histdf), sd = sd(kitSelect$histdf)))

  })
} 

我在 renderUI 调用中收到“下标越界”错误,我不知道这意味着什么。

标签: rshinyreactive

解决方案


推荐阅读