R Shiny:使用后退操作按钮转到上一个conditionalPanel

时间:2016-06-10 13:24:06

标签: r shiny

我正在尝试使用操作按钮返回上一个条件面板。直到现在我已经编写了以下代码来浏览一系列条件面板,但我无法回到之前的情况,因为我无法更新输入值,它给了我以下错误:

警告:$< - .inactivevalues中的错误:尝试将值分配给只读的反应值对象+

代码如下:

ui.R

shinyUI(
  fluidPage(
    conditionalPanel(
      condition <- "typeof input.link_click  === 'undefined'",
      leafletOutput("Map", width = 1000, height = 500)

    ),


    conditionalPanel(
      condition <- "typeof input.link_click_Site  === 'undefined' && typeof input.link_click  !== 'undefined'",


      leafletOutput("CountryMap", width = 1000, height = 500)

    ),
    conditionalPanel(
      condition <- "typeof input.link_click_Site  !== 'undefined'",

      h3("Plots related to site chosen"),
      textOutput(outputId = "Check"),
      actionButton("Back", "Back")
    )
  )  
)

server.R

library(shiny)
library(leaflet)
library(maps)

shinyServer(function(input, output, session) {

Country = map("world", fill = TRUE, plot = FALSE, regions="USA")
output$Map <- renderLeaflet({
  leaflet(Country) %>% addTiles() %>%  setView(0, 0,  zoom = 2)%>%
    #leaflet(target) %>% addTiles() %>%
    addPolygons(fillOpacity = 0.6,
                fillColor = 'blue',
                smoothFactor = 0.5, stroke = TRUE, weight = 1, popup =  paste("<b>", "USA", "</b><br>",
                                                                              actionLink(inputId = "View", 
                                                                                         label = "View Details", 
                                                                                         onclick = 'Shiny.onInputChange(\"link_click\",  Math.random())')))
})

output$CountryMap <- renderLeaflet({

  leaflet(Country) %>% addTiles() %>%   
    fitBounds(Country$range[1], Country$range[3], Country$range[2], Country$range[4])%>%
    addMarkers(lng = -71.03 , lat = 42.37, popup = paste("<b>", "Boston", "</b><br>",
                                                         actionLink(inputId = "View", 
                                                                    label = "View Details", 
                                                                    onclick = 'Shiny.onInputChange(\"link_click_Site\",  Math.random())')))
})


observeEvent(input$link_click_Site, {
  output$Check <- renderText("Success")

})

observeEvent(input$Back, {
  input$link_click_Site <- 0
})

})

1 个答案:

答案 0 :(得分:1)

我建议您在输入值中添加一个类型,您的conditionalPanels正在测试,您可以控制。

您目前正在检查输入link_clicklink_click_Site是否为undefined。设置完毕后,您可以使用customMessageHandler重置它们,但当然不能undefined。我会选择另一个像JavaScript null这样的唯一值。

所以基本上将所有条件更改为未定义或为空或类似地未定义且不为空。然后,您可以通过将输入设置为null来重置输入。

见下面的代码:

library(shiny)
library(leaflet)    
library(maps)

ui <- shinyUI(
  fluidPage(
    tags$script("
      Shiny.addCustomMessageHandler('resetInputValue', function(variableName){
        Shiny.onInputChange(variableName, null);
      });
    "),

    conditionalPanel(
      condition <- "input.link_click  === undefined || input.link_click === null",
      leafletOutput("Map", width = 1000, height = 500)

    ),


    conditionalPanel(
      condition <- "(input.link_click_Site  === undefined || input.link_click_Site === null) && (input.link_click  !== undefined && input.link_click !== null)",


      leafletOutput("CountryMap", width = 1000, height = 500)

    ),
    conditionalPanel(
      condition <- "(input.link_click_Site  !== undefined && input.link_click_Site !== null)",

      h3("Plots related to site chosen"),
      textOutput(outputId = "Check"),
      actionButton("Back", "Back")
    )
  )  
)

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

  Country = map("world", fill = TRUE, plot = FALSE, regions="USA")
  output$Map <- renderLeaflet({
    leaflet(Country) %>% addTiles() %>%  setView(0, 0,  zoom = 2)%>%
      #leaflet(target) %>% addTiles() %>%
      addPolygons(fillOpacity = 0.6,
                  fillColor = 'blue',
                  smoothFactor = 0.5, stroke = TRUE, weight = 1, popup =  paste("<b>", "USA", "</b><br>",
                                                                                actionLink(inputId = "View", 
                                                                                           label = "View Details", 
                                                                                           onclick = 'Shiny.onInputChange(\"link_click\",  Math.random())')))
  })

  output$CountryMap <- renderLeaflet({

    leaflet(Country) %>% addTiles() %>%   
      fitBounds(Country$range[1], Country$range[3], Country$range[2], Country$range[4])%>%
      addMarkers(lng = -71.03 , lat = 42.37, popup = paste("<b>", "Boston", "</b><br>",
                                                         actionLink(inputId = "View", 
                                                                    label = "View Details", 
                                                                    onclick = 'Shiny.onInputChange(\"link_click_Site\",  Math.random())')))
  })


  observeEvent(input$link_click_Site, {
    output$Check <- renderText("Success")

  })

  observeEvent(input$Back, {
    session$sendCustomMessage(type = 'resetInputValue', message = "link_click_Site")
    session$sendCustomMessage(type = 'resetInputValue', message = "link_click")
  })
}

shinyApp(ui, server)