我想使用EBImage为图像分析创建一个闪亮的仪表板应用程序。我怀疑的是如何使用EBImage包将局部图像加载到应用程序进行后验分析。
在互联网上,我看到如何从EBImage-package的系统文件加载图像,如下例所示:
library(shiny)
library(EBImage)
library(displayWidget)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Display widget demo"),
# Sidebar with a select input for the image
sidebarLayout(
sidebarPanel(
selectInput("image", "Sample image:", list.files(system.file("images", package="EBImage")))
),
# Show a plot of the generated distribution
mainPanel(
tabsetPanel(
tabPanel("Static display", plotOutput("display")),
tabPanel("Interactive widget", displayWidgetOutput("widget"))
)
)
)
)
server <- function(input, output) {
img <- reactive({
f = system.file("images", input$image, package="EBImage")
x = readImage(f)
})
output$widget <- renderDisplayWidget({
displayWidget(img())
})
output$display <- renderPlot({
display(img(), method="raster", all=TRUE)
})
}
# Run the application
shinyApp(ui = ui, server = server)
我知道如何使用以下方法加载本地数据:
DataXLSX <- reactive({
inFile <- input$fileXLSX
if (is.null(inFile))
return(NULL)
loadXLSX <- read.xlsx(inFile$datapath)
loadXLSX
})
但我不能对readImage()做同样的事情。一些帮助?谢谢
答案 0 :(得分:1)
要在您的应用中启用文件上传,您需要替换selectInput("image", ...)
窗口小部件,以便通过fileInput
控件从预定义的示例文件列表中选择图像,并在响应式表达式中使用其值img
访问上传文件的本地副本。您还需要通过调用renderDisplayWidget
来保护renderPlot
和req(img())
中的表达式的执行,以便推迟图像显示,直到选择并加载图像文件。请参阅下面的完整工作示例。
请注意,R包displayWidget提供的功能已集成到EBImage devel分支中,因此从 EBImage 版本4.19开始,加载 displayWidget 已过时0.3。
library("shiny")
library("EBImage")# >= 4.19.3
ui <- fluidPage(
# Application title
titlePanel("Image display"),
# Sidebar with a select input for the image
sidebarLayout(
sidebarPanel(
fileInput("image", "Select image")
),
# Show a plot of the generated distribution
mainPanel(
tabsetPanel(
tabPanel("Static raster", plotOutput("raster")),
tabPanel("Interactive browser", displayOutput("widget"))
)
)
)
)
server <- function(input, output) {
img <- reactive({
f <- input$image
if (is.null(f))
return(NULL)
readImage(f$datapath)
})
output$widget <- renderDisplay({
req(img())
display(img())
})
output$raster <- renderPlot({
req(img())
plot(img(), all=TRUE)
})
}
# Run the application
shinyApp(ui = ui, server = server)