【发布时间】:2020-04-25 20:08:24
【问题描述】:
我正在尝试将 tmap 集成到闪亮的应用程序中,但我遇到了反应性问题。我收到一个错误,暗示函数 renderTmap() 不会创建反应性环境(而“经典”renderXXX() 函数会)。
这是我收到的错误消息:
.getReactiveEnvironment()$currentContext() 中的错误:操作不 在没有主动反应上下文的情况下允许。 (你试图做某事 这只能从反应式表达式或观察者内部完成。)
因此我没有设法创建考虑输入值的地图...
这是我正在尝试做的一个简单示例(仅当我不根据输入值更新 data_map 时才有效!)
library(shiny)
library(sf)
library(tmap)
nc=st_read(system.file("shape/nc.shp", package="sf"))
# Define UI for application that draws a histogram
ui=fluidPage(
selectInput("name",
"name",
unique(nc$NAME)),
tmapOutput("map"))
)
server=function(input, output) {
output$map <- renderTmap({
data_map <- subset(nc,NAME==input$name)
tm_shape(data_map)+
tm_borders()
})
}
shinyApp(ui=ui,server=server)
有人对此问题有解释/解决方法吗?
P.S.:我真的很喜欢 renderTmap 而不是 renderLeaflet:我正在尝试向迄今为止使用过 tmap 的学生教授闪亮的东西......
【问题讨论】:
-
observe ({ output$map <- renderTmap({ data_map <- subset(nc,NAME==input$name) tm_shape(data_map)+ tm_borders() }) })完成了这项工作,但坦率地说,我不知道为什么,可能renderTmap在存在依赖项时无法正常工作,即input$name,因为如果我们做output$map <- renderTmap({ tm_shape(nc)+ tm_borders() }). -
没错,谢谢!在与 renderTmap() 函数关联的示例中,有一些接近此解决方案的内容,尽管它使用函数 tmapProxy() 而不是 renderTmap()。我仍然想知道为什么需要“observe()”。我很难向我的学生解释这一点;-)。