我开发了一个闪亮的小应用程序: app
应用程序绘制在selectizeInput中选择的电台的降雨情况。 每次添加或删除工作站时,都会将数据发送到外部服务器。
目前,它将从外部服务器获取所有工作站的数据,无论它们是否保留在列表中。这增加了不必要的时间和计算量。 我的问题是如何减少获取已经存在的数据的需求?
因为我不能展示真实的应用程序,所以我创建了一个可再现的应用程序来说明我的代码流程:
#data
id <- as.numeric(1:26)
names(id) <- letters
#dataframe function
get.rain.data <- function(id){
print(id)
vec <- 1:100
id <- as.numeric(id)
print(id)
df <- do.call(rbind,lapply(id,function(i)
tibble(x=vec,y=vec*i+vec^2*i,
id=as.factor(rep(i,length(vec))))))
return(df)
}
#plot function
plot.rain <- function(df){
print(df)
p <- ggplot(df,aes(x=x,y=y,group=id))+
geom_line(aes(color=id),size=0.6)
ggplotly(p,height=700)
}
#### UI
ui <- fluidPage(
titlePanel(h1("Rain Intensities and Cumulative Rain")),
sidebarLayout(
sidebarPanel(
helpText("Check rain with info from
IMS.gov.il"),
selectizeInput("var", h3("Select station"),
choices = id,
multiple = T,
selected = 4)
),
mainPanel(
plotlyOutput("rain")
)
)
)
# Define server logic ----
server <- function(input, output) {
dataInput <- reactive({
get.rain.data(input$var)
})
output$rain <- renderPlotly({
req(input$var)
plot.rain(dataInput())
})
}
# Run the application
shinyApp(ui = ui, server = server)
答案 0 :(得分:0)
您具有所需的代码。您要在所有要使用input $ var的结果的地方调用DataInput()。通过创建反应性dataInput函数,将在input $ var更新时调用
# Define server logic ----
server <- function(input, output) {
dataInput <- reactive({
get.rain.data(input$var)
})
output$rain <- renderPlotly({
plot.rain(dataInput())
})
}
我认为您需要缓存值,以便仅查询一次。您可能需要查看备忘录包,它可以自动为您完成此操作。