2017-05-10 1 views
0

Une question à propos de dateRangeInput. J'ai connaissance des paramètres min/max, start/end.shiny dateRange input - définir les contraintes sur la plage

J'ai besoin de mettre une contrainte sur la plage qui est donnée, à savoir. sur la différence end - start. Spécifiquement, je donne à l'utilisateur la possibilité de calculer une moyenne mobile, et je dois m'assurer qu'il y a au moins 6 mois entre start et end.

Comment puis-je y parvenir?

(Il est un moyen d'avoir des entrées dépendent les uns des autres (voir la réponse à this question). Ici, cependant, nous voulons que le datarangeInput[1] dépendre daterangeInput[2] ... mais ces deux. Ne sont pas tout à fait séparés)

EDIT: les commentaires ci-dessous répondent à peu près à la question telle que formulée à l'origine (voir ci-dessous). Pour que le code soit entièrement satisfaisant cependant, comment pouvez-vous vous assurer que la plage d'entrée est corrigée par le serveur AVANT que d'autres calculs qui dépendent de cette plage d'entrée soient eux-mêmes démarrés? Avec ma solution existante (voir ci-dessous), l'observateur corrigera la valeur trop tard: calculs basés sur la plage défectueuse déjà commencée à cette date

+1

la solution évidente est de calculer les valeurs dans le serveur, puis mettez-le contrôle avec ces valeurs dans l'interface utilisateur avec 'renderUI'. Une raison de ne pas le faire? Je ne comprends pas non plus ce que vous avez l'intention de faire avec la «moyenne mobile». Moyenne mobile de ce qui va où? –

+1

voir ici: http://stackoverflow.com/questions/43785070/make-upper-value-of-r-shiny-slider-range-always-be-higher-than-lower-value/43787513#43787513. Vous pouvez mettre à jour la solution de 1m -> 6m – BigDataScientist

+0

Thx beaucoup @MikeWise. J'espère avoir capturé vos commentaires ci-dessous. Si vous vous étendez sur la solution, comment pouvez-vous vous assurer que la plage d'entrée est corrigée par le serveur AVANT que d'autres calculs qui dépendent de cette plage d'entrée soient eux-mêmes démarrés? Avec ma solution existante (voir ci-dessous), l'observateur corrigera la valeur trop tard: calculs basés sur la plage défectueuse déjà commencée à ce moment-là. – hartmut

Répondre

2

Suite aux commentaires de BigDataScientist et de Mike Wise, j'ai adapté this answer pour résoudre le problème. Le résultat est un code serveur qui garantit que la plage résultant du daterangeInput est supérieure à une valeur donnée (ici, smallestWindow).

rm(list=ls()) 
library(shiny) 

mindate <- "1980-01-01" 
maxdate <- Sys.Date() 
smallestWindow <- 18 * 31 
from <- maxdate - smallestWindow 

ui <- fluidPage(
    mainPanel(uiOutput("slider")) 
) 

server <- function(input, output, session) { 
    observeEvent(input$timeperiod,{ 
    if(input$timeperiod[1] > (input$timeperiod[2] - smallestWindow)){ 
     updateDateRangeInput(session, "timeperiod", start=input$timeperiod[2] - smallestWindow) 
    } 
    }) 

    output$slider <- renderUI({ 
    dateRangeInput("timeperiod", "Time Period:" 
        , min=as.Date(mindate), max=maxdate 
        , start = from , end = maxdate) 
    }) 

} 
shinyApp(ui, server) 
+0

Nice. Merci pour le crédit. –