#r #shiny #satellite-image
#r #блестящий #изображение со спутника
Вопрос:
Я пытаюсь создать небольшое блестящее приложение, которое могло бы отображать NDVI из файла tiff, загруженного из папки.
Вот что я сделал :
library(shiny)
library(leaflet)
library(dbplyr)
library(raster)
library(rgdal)
ui<-fluidPage(
titlePanel("NDVI calculation"),
sidebarPanel(
fileInput('layer', 'Choose Layer', multiple=FALSE, accept='tiff')
),
imageOutput(outputId = "ndvi")
)
server<-function(input, output) {
output$ndvi <- renderPlot({
S2 <- input$layer
S2 <- stack(S2)
S2 <- brick(S2)
S2_ndvi <- (S2[[4]] - S2[[1]]) / (S2[[4]] S2[[1]])
plot(S2_ndvi,
main = "NDVI of site 12RD8",
axes = FALSE, box = FALSE) })
}
shinyApp( ui=ui, server=server)
Но я получаю это сообщение об ошибке:
Предупреждение: ошибка в стеке.по умолчанию: требуется хотя бы один векторный элемент
Может кто-нибудь мне помочь, пожалуйста?
Ответ №1:
Прямо сейчас приложение shiny пытается создать стек из ничего на сервере, так как при загрузке приложения input$layer имеет значение null. Самый простой способ скрыть эту ошибку до загрузки слоя — использовать req()
. Вы помещаете необходимые входные данные внутрь req()
, и приложение не будет запускать этот фрагмент кода, если эти входные данные не имеют значения.
server<-function(input, output) {
output$ndvi <- renderPlot({
req(input$layer)
S2 <- input$layer
S2 <- stack(S2)
S2 <- brick(S2)
S2_ndvi <- (S2[[4]] - S2[[1]]) / (S2[[4]] S2[[1]])
plot(S2_ndvi,
main = "NDVI of site 12RD8",
axes = FALSE, box = FALSE) })
}
Редактировать
Вы также можете написать оператор if else на основе значения if input$layer равно null is.null(input$layer)
и, когда оно равно null, попросить пользователя загрузить файл
Комментарии:
1. Большое вам спасибо, эко-Алис! Но теперь, когда слой загружается, приложение выходит из строя, и я получаю это сообщение об ошибке в консоли R:
Warning in stack.data.frame(x, ...) : non-vector columns will be ignored Erreur : C stack usage 15922880 is too close to the limit
У вас есть представление о том, что может привести к такой ошибке?