2015-11-11 3 views
0

Я работаю над блестящим приложением, в котором карта буклета анимируется во времени, но вы можете приостановить ее, а затем использовать слайдер, чтобы посмотреть на определенные годы. Я сделал фиктивную версию функциональности и разместил его здесь: https://seth127.shinyapps.io/sliderБлестящее приложение с лифтом: uiOutput не отображается до тех пор, пока не будет нажата кнопка goButton.

Мой вопрос, то sliderInput выбрать год (который находится внутри renderUI в server.R) не появится, пока вы не имеете сначала щелкнул goButton (который приостанавливает анимацию). Я не могу понять, почему.

Я хочу, чтобы он был по умолчанию до 2000 года (при вводе $ animate == 0). Я добавил текстовый ввод, чтобы проверить, что эта функция должна работать, и она работает для renderText, но не для renderUI. Буду признателен за любую оказанную помощь. Код ниже:

server.R

require(maps) 
require(leaflet) 
require(shiny) 

fakeData <- data.frame(year=seq(1974,2014,by=1), 
        lat=seq(34, 40, by=0.1463415), 
        long=seq(-118,-73, by=1.097561), 
        artist="fake", 
        album="fake", 
        hometown="fake", 
        chart="PJ") 

pickYear <- function(year, data) { 
    yearCities <- data[as.numeric(data$year)==year, ] 
    yearCities 
} 

shinyServer(
function(input, output) { 
    #refresh animation every 60 seconds 
    getit <- reactive({ 
     invalidateLater(60000, session=NULL) 
     Sys.time() 
    }) 
    #change animation year every 2 seconds 
    year <- reactive({ 
     if(input$animate %% 2 != 0) { 
      invalidateLater(2000, session=NULL) 
      1984 + (round(as.numeric(Sys.time() - getit())/2)) 
     } else {1984 + (round(as.numeric(Sys.time() - getit())/2))} 

     }) 


output$pressedGo <- reactive({if(input$animate==0) {"you haven't pressed go"} else {"now you have"}}) 

output$reactiveSlider <- renderUI({ 
    yearVal <- if(input$animate == 0) {2000} else {year()} 
    sliderInput('year', label='Pick A Year:', value = yearVal, 
       min = 1984, max = 2015, step = 1, sep="") 

}) 

    output$map <- renderLeaflet({ 
      leaflet(data = pickYear(input$year, fakeData)) %>% addTiles() %>% 
       addMarkers(~long, ~lat) %>% setView(-97.887318, 40.422487, 4) 
}) 

}) 

ui.R

require(maps) 
require(leaflet) 
require(shiny) 

shinyUI(
pageWithSidebar(
    # Application title 
    headerPanel(
     "" 
    ), 
    sidebarPanel(

    ), 
    mainPanel(
     uiOutput("reactiveSlider"), 
     actionButton('animate', "Animate/Pause Map"), 
     h3(textOutput("pressedGo")), 
     p(" "), 
     leafletOutput("map") 
    ) 
) 
) 
+0

довольно странно, кажется, что есть некоторый конфликт имен. Если вы переименуете 'reactiveSlider' в то, что не начинается с 'r', оно работает. – jenesaisquoi

ответ

1

не объяснение вопроса, но потенциальная альтернатива - вы можете использовать встроенную функциональность в блестящей сделать что вы хотите:

sliderInput("animation", "Looping Animation:", 1984, 2015, 1, step = 1, 
       animate=animationOptions(interval=1, loop=T)) 

Ключевая строка здесь - аргумент анимации. См. Больше примеров здесь: http://shiny.rstudio.com/articles/sliders.html

+0

Эй! Это проще и чище, чем то, как я это делал! Спасибо за помощь. – seth127

+0

Это решение моей конкретной проблемы, но она все еще не объясняет странность с помощью actionButton. У меня такая же проблема в другом приложении, поэтому, если у кого-то есть какая-то мудрость по этому вопросу, я бы хотел это услышать. Еще раз спасибо. – seth127

+0

@ seth127 Я отследил проблему до того, что Leaflet зависел от слайдера через вашу функцию pickyear. Если вы закомментируете рекламный листок ui, вы заметите, что ползунок снова появляется. Может быть, ошибка в листочке, или особенность ленивой оценки блестящей. Я не grokking – Chris

Смежные вопросы