Как получить доступ к внешним переменным, не выбрасывая ошибку "объект не найден" в этом коде R?
Я пытаюсь построить динамическое веб-приложение на основе пакета 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 ответ
Это похоже на проблему реактивности. Вы можете определить реактивные функции и сохранить переменные для обновления: я не внес никаких изменений в код пользовательского интерфейса, поэтому я включил здесь только код сервера.
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.
В любом случае, я надеюсь, что то, что я предоставил выше, поможет вам быстрее найти решение.