我正在尝试基于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_heatmap
和update_heatmap
的调用引发错误。
外部变量之一tabelaHeatMap
似乎可以访问,而另一个变量weightHeatMap
使程序抛出 eval错误:找不到对象'weightHeatMap'错误 。
两者都在if
内部可见,但是我不知道有一些带有R或Shiny的“陷阱”。
为什么程序无法在该代码的特定位置“找到” weightHeatMap
?我该如何克服?
答案 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
错误也不再存在。
我仍然要面对的唯一问题是weight
和add_heatmap()
函数中的update_heatmap()
参数。我怀疑这可能是一个错误。当我添加weight = getAllInputs()$updatedWeightMap
时,控制台将引发一个function getAllInputs() not found
错误,但是我在其中留下了调试代码,以验证getAllInputs()
确实存在并正在更新。
根据所有证据,得出以下结论似乎是合理的:
无论哪种方式,我希望上面提供的内容都能帮助您更快地找到解决方案。