Вычисление NDVI в Rshiny

#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 У вас есть представление о том, что может привести к такой ошибке?