0

我正在尝试构建一个基于 Shiny 包的动态 Web 应用程序。

我在带有 RStudio 1.1.4 的 Windows 10 上运行 R3.5.1 x64。我需要变量tabelaHeatMap并且weightHeatMap没有固定值,因为我正在动态检索它们并且我不想要太多的代码重复。但我发现的唯一动态方法不起作用。

   library('shiny')
library('googleway')
ui <- fluidPage(
  sidebarLayout(
    position = "right",
    sidebarPanel = sidebarPanel(
      radioButtons(
        inputId = "radioButton",
        label = h3("Dados para visualização"),
        choices = list("Receita líq." = 1,
                       "Custos/receita líq." = 2),
        selected = 2
      )
    ),
    mainPanel = mainPanel(google_mapOutput(outputId = "map", width = "100%"))
  )
)


server <- function(input, output) {
  map_key = #HERE I PUT MY ACTUAL GOOGLE MAPS KEY

  tabela1 = data.frame(
    latitude = c(1, 2, 3),
    longitude = c(1, 2, 3),
    receita_liq = c(1, 2, 3)
  )
  tabela2 = data.frame(
    latitude = c(1, 2, 3),
    longitude = c(1, 2, 3),
    custo_por_receita_liq = c(1, 2, 3)
  )

  tabelaHeatMap = tabela2
  weightHeatMap = "custo_por_receita_liq"

  output$map <- renderGoogle_map({
    gmap = google_map(
      fullscreen_control = TRUE,
      street_view_control = FALSE,
      map_type_control = FALSE,
      search_box = FALSE,
      key = map_key
    )

    #Error
    add_heatmap(
      map = gmap,
      data = tabelaHeatMap,
      lat = "latitude",
      lon = "longitude",
      option_radius = 0.25,
      weight = weightHeatMap
    )
  })


  observeEvent(input$radioButton, {
    if (input$radioButton == 1) {
      tabelaHeatMap <<- tabela1
      weightHeatMap <<- "receita_liq"
    }
    else if (input$radioButton == 2) {
      tabelaHeatMap <<- tabela2
      weightHeatMap <<- "custo_por_receita_liq"
    }

    #Also produces the same error
    update_heatmap(
      map = google_map_update(map_id = "map"),
      data = tabelaHeatMap,
      lat = "latitude",
      lon = "longitude",
      weight = weightHeatMap
    )
  })
}

shinyApp(ui = ui, server = server)

从代码中可以看出,对方法的调用add_heatmapupdate_heatmap抛出错误。一个外部变量 ,tabelaHeatMap似乎是可访问的,但另一个 ,weightHeatMap使程序在 eval 中抛出 Error: object 'weightHeatMap' not found 错误。两者都在ifs 中可见,但是我不知道 R 或 Shiny 有一些“陷阱”。

为什么程序不能weightHeatMap在代码的那个特定位置“找到”?我该如何克服呢?

4

1 回答 1

1

这似乎是一个反应性问题。您可以定义反应函数并存储要更新的变量:我没有对 UI 代码进行任何更改,所以我在这里只包含了服务器代码。

server <- function(input, output) {
map_key = "testKey" 

getRadioInput1 <- shiny::reactive({
    mapVariablesButton1 <- list(tabelaHeatMap = tabela1, weightHeatmap = "receita_liq")
    return(mapVariablesButton1)  
  })  

getRadioInput2 <- shiny::reactive({
    mapVariablesButton2 <- list(tabelaHeatMap = tabela2, weightHeatmap = "custo_por_receita_liq")
    return(mapVariablesButton2)  
  })  

getAllInputs <- shiny::eventReactive(
    input$radioButton, {
      if (input$radioButton == 1) {
        print("Radio button == 1")
        tabelaHeatMap <- getRadioInput1()$tabelaHeatMap
        weightHeatmap <- getRadioInput1()$weightHeatmap
        finalInputs <- list(updatedHeatMap = tabelaHeatMap, updatedWeightMap = weightHeatmap)
        return(finalInputs)
      } else {
        print("Radio button == 2")
        tabelaHeatMap <- getRadioInput2()$tabelaHeatMap
        weightHeatmap <- getRadioInput2()$weightHeatmap
        finalInputs <- list(updatedHeatMap = tabelaHeatMap, updatedWeightMap = weightHeatmap)
        return(finalInputs)
      }
    }
  )

  tabela1 = data.frame(
      latitude = c(1, 2, 3),
      longitude = c(1, 2, 3),
      receita_liq = c(1, 2, 3)
    )

  tabela2 = data.frame(
    latitude = c(1, 2, 3),
    longitude = c(1, 2, 3),
    custo_por_receita_liq = c(1, 2, 3)
  )

  shiny::observe(print(getAllInputs()))


  output$map <- renderGoogle_map({
    gmap = google_map(
      fullscreen_control = TRUE,
      street_view_control = FALSE,
      map_type_control = FALSE,
      search_box = FALSE,
      key = map_key
    )

    #Error
    add_heatmap(
      map = gmap,
      data = getAllInputs()$updatedHeatMap,
      lat = "latitude",
      lon = "longitude",
      option_radius = 0.25,
      weight = 1
    )
  })

  #Also produces the same error
    update_heatmap(
      map = google_map_update(map_id = "map"),
      data = getAllInputs()$updatedHeatMap,
      lat = "latitude",
      lon = "longitude",
      weight = 1
    )
  })
}

我已经在我的机器上试过这个,并且代码运行。我非常简短地看到了输出(这是因为我的密钥无效)并且object not found错误不再存在。

我仍然面临的唯一问题是and函数中的weight参数。我怀疑这可能是一个错误。当我添加时,控制台会抛出一个错误,但是我已将调试代码留在其中以验证它确实存在并且正在更新。add_heatmap()update_heatmap()weight = getAllInputs()$updatedWeightMapfunction getAllInputs() not foundgetAllInputs()

基于所有证据,似乎可以得出以下结论:

  • 代码中有一个非常愚蠢的错误,我们都错过了:-)或/和,
  • 有一个问题需要向 googleway 软件包开发人员报告。

无论哪种方式,我希望我上面提供的内容可以帮助您更快地找到解决方案。

于 2018-12-28T19:09:38.180 回答