在 R Shiny 中计算 NDVI

Calculating NDVI in Rshiny

我正在尝试创建一个闪亮的小应用程序,它可以根据从文件夹加载的 tiff 文件绘制 NDVI。

这是我所做的:

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)

但我收到此错误消息:

Warning: Error in stack.default: at least one vector element is required

有人可以帮我吗?

现在,闪亮的应用程序正在尝试从服务器中的任何内容创建堆栈,因为当应用程序加载时,input$layer 为空。在上传图层之前隐藏该错误的最简单方法是使用 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)    })
      
  }

编辑 您还可以根据 input$layer 是否为 null is.null(input$layer) 编写 if else 语句,当它为 null 时要求用户上传文件