Control alternativo de un control deslizante Entrada entre un valor derivado y un valor seleccionado por el usuario

Tengo una aplicación Shiny muy simple, en la que tengo un conjunto de datos sobre clientes anteriores y un conjunto de datos sobre 3 clientes nuevos. Todos mis datos consisten solo en 2 variables: edad y puntaje.

El propósito es seleccionar uno de los 3 nuevos clientes, y ver cómo anotaron los clientes anteriores de edades similares. Hacemos esto con un diagrama de dispersión simple.

Por ejemplo, dado que el nuevo cliente # 1 tiene 30 años, podemos ver cómo todos los clientes anteriores de 25 a 35 años obtuvieron puntajes:

(Mis disculpas por la pequeña imagen)

Todo funciona bien El problema comienza cuando agrego un control deslizante de edad con la intención de permitir que el usuario anule la vista predeterminada proporcionada detrás de escena por la edad del nuevo cliente.

Para continuar con el ejemplo, digamos que tenemos curiosidad por ver cómo los clientes anteriores de, digamos, edades entre 18 y 40 años, ya no solo entre 25 y 35 años.

De alguna manera, necesito implementar un proceso de dos pasos:

El subconjunto de los datos debe COMENZAR con un + - 5 codificado con respecto a la edad del nuevo cliente seleccionado.SIGUIENTE: el control deslizante de la interfaz de usuario debe controlar el subconjunto de datos.

Me enfrento a un problema fundamental de decirle a Shiny que se comunique entre la interfaz de usuario y los datos de dos maneras diferentes, en diferentes momentos. ¿Alguna idea sobre cómo puedo superar esto?

Código completo a seguir ... pero estoy pensando en voz alta aquí: de alguna manera necesito cambiar:

subset_historic_customers <- reactive({ DF <- historic_customers[which((historic_customers$age >= get_selected_customer()$age-5) & (historic_customers$age <= get_selected_customer()$age+5)), ] return(DF) })

a

subset_historic_customers <- reactive({ # start the same as above: DF <- historic_customers[which((historic_customers$age >= get_selected_customer()$age-5) & (historic_customers$age <= get_selected_customer()$age+5)), ] return(DF) # ...but if someone uses the age selection slider, then: DF <- historic_customers[which((historic_customers$age >= input$age[1]) & (historic_customers$age <= input$age[2])), ] })

¡Gracias!

app.R

## app.R ##
server <- function(input, output) {

  new_customers <- data.frame(age=c(30, 35, 40), score=c(-1.80,  1.21, -0.07))
  historic_customers <- data.frame(age=sample(18:55, 500, replace=T), score=(rnorm(500)))

  get_selected_customer <- reactive({cust <- new_customers[input$cust_no, ]
                                     return(cust)})


  subset_historic_customers <- reactive({
    DF <- historic_customers[which((historic_customers$age >= get_selected_customer()$age-5) & (historic_customers$age <= get_selected_customer()$age+5)), ]
#    DF <- historic_customers[which((historic_customers$age >= input$age[1]) & (historic_customers$age <= input$age[2])), ]

    return(DF)
    })

  output$distPlot <- renderPlot({
    plotme <<- subset_historic_customers()
    p <- ggplot(data=plotme, aes(x=plotme$age, y=plotme$score))+ geom_point()
    my_cust_age <- data.frame(get_selected_customer())
    p <- p + geom_vline(data=my_cust_age, aes(xintercept=age))
    print(p)
    })
}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      numericInput(inputId="cust_no", label="Select new customer:", value=1),
      sliderInput(inputId="age", "Age of historic customer:", min=18, max = 55, value=c(18, 55), step=1, ticks=TRUE)
    ),
    mainPanel(plotOutput("distPlot"))
  )
)

shinyApp(ui = ui, server = server)

Respuestas a la pregunta(1)

Su respuesta a la pregunta