Как получить доступ к внешним переменным, не выбрасывая ошибку «объект не найден» в этом коде R? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь создать динамическое веб-приложение на основе пакета Shiny.

Я использую R3.5.1 x64 в Windows 10 с RStudio 1.1.4.Мне нужно, чтобы переменные 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_heatmap и update_heatmap выдают ошибку.Одна из внешних переменных, tabelaHeatMap, кажется доступной, но другая, weightHeatMap, заставляет программу выдавать ошибку в eval: объекту weightHeatMap не найдена ошибка .Оба видны внутри if s, но есть некоторая «ошибка» с R или Shiny, которую я не знаю.

Почему программа не может «найти» weightHeatMap в этом конкретном местекод?Как я могу преодолеть это?

1 Ответ

0 голосов
/ 28 декабря 2018

Это похоже на проблему реактивности.Вы можете определить реактивные функции и сохранить переменные для обновления: я не внес никаких изменений в код пользовательского интерфейса, поэтому я включил здесь только код сервера.

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 больше не возникает.

Единственная проблема, с которой я все еще сталкиваюсь, это проблема аргумента weight в функциях add_heatmap() и update_heatmap().Я подозреваю, что это может быть ошибкой.Когда я добавляю weight = getAllInputs()$updatedWeightMap, консоль выдает ошибку function getAllInputs() not found, однако я оставил там свой отладочный код, чтобы убедиться, что getAllInputs() действительно существует и обновляется.

Основываясь на всех доказательствах, представляется разумным заключить следующее:

  • В коде действительно глупая ошибка, которую мы оба пропустили :-) или / и,
  • Существует проблема, о которой необходимо сообщить разработчикам пакета googleway.

В любом случае, я надеюсь, что то, что я предоставил выше, поможет вам быстрее найти решение.

...