如何在R代码中不抛出“找不到对象”错误的情况下访问外部变量?

时间:2018-12-28 17:31:48

标签: r shiny googleway

我正在尝试基于Shiny软件包构建动态Web应用程序。

我在带有RStudio 1.1.4的Windows 10上运行R3.5.1 x64。 我需要变量tabelaHeatMapweightHeatMap不具有固定值,因为我正在动态地检索它们并且我不想过多的代码重复。但是我发现的唯一动态方法是行不通的。

   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错误:找不到对象'weightHeatMap'错误 。 两者都在if内部可见,但是我不知道有一些带有R或Shiny的“陷阱”。

为什么程序无法在该代码的特定位置“找到” weightHeatMap?我该如何克服?

1 个答案:

答案 0 :(得分: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错误也不再存在。

我仍然要面对的唯一问题是weightadd_heatmap()函数中的update_heatmap()参数。我怀疑这可能是一个错误。当我添加weight = getAllInputs()$updatedWeightMap时,控制台将引发一个function getAllInputs() not found错误,但是我在其中留下了调试代码,以验证getAllInputs()确实存在并正在更新。

根据所有证据,得出以下结论似乎是合理的:

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

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