为什么这段代码不适用于被动功能?

时间:2015-07-17 15:02:36

标签: r shiny

我想这个代码刷新每次移动地图时要刷新的输入值。

有人可以告诉我为什么这段代码不起作用?当我用“观察”功能替换服务器端的“被动”值时,它可以实现我的目的。

ui.R

library(shiny)
library(leaflet)

shinyUI(navbarPage(
    title="HeatXPlorers", id="nav",
    tabPanel(title="Interactive map",
        div(class="outer",
            leafletOutput(outputId = "map", width="100%", height="100%")
        )
    ),
    tabPanel(title="Producers",
        fluidRow(column(2,
            numericInput(inputId= "minLon_prod",
                label = "Min Longitude", value=2.5)
        ))
    )
))

server.r

library(shiny)
library(leaflet)
library(dplyr)

shinyServer(function(input, output, session) {

    # Create the map
    output$map <- renderLeaflet({
        #input$map_bounds and input$map_zoom are created when the leaflet is     created

        leaflet() %>%
            addTiles(
                urlTemplate = "//{s}.tiles.mapbox.com/v3/jcheng.map-    5ebohr46/{z}/{x}/{y}.png",
                attribution = 'Maps by <a href="http://www.mapbox.com/">Mapbox</a>') %>%
            setView(lng = 2.49, lat = 47, zoom = 6)
    })

    ################ END OF SINGLE TIME EXECUTION
    ## Interactive Map - for map ###########################################

    prodInBounds <- reactive({
        bounds <- input$map_bounds
        updateNumericInput(session, inputId="minLon_prod", value = bounds$west)
    })
})

1 个答案:

答案 0 :(得分:1)

你的问题可以减少到观察者和反应性表达之间的根本区别。让我引用观察的官方文件:

  

观察者就像一个反应性表达(...)但与反应性表达不同,它不会产生结果(...)因此,观察者只对其副作用有用(...)。

     

反应式表达式和观察者之间的另一个对比是他们的执行策略。如果没有调用它们,则反应式表达式使用惰性求值(...),然后它们将永远不会重新执行。相反,观察者使用急切评估;一旦他们的依赖关系发生变化,他们就会安排自己重新执行。

现在让我们重点介绍两件事:

  • 在您的代码中使用updateNumericInput作为副作用,因此不会返回任何有用的内容,因为observe是自然选择。
  • prodInBounds从未使用过,因此永远不会被评估,因为updateNumericInput永远不会被调用。