我正在开发一个闪亮的网络应用程序,旨在:
myDummyFun
d
作为输入,以跨多个标签绘制函数这是我正在做的简化版本,它说明了问题(尽管使用mtcars
数据集代替加载的文件:
library(shiny)
library(dplyr)
data(mtcars)
ui <- fluidPage(
tabsetPanel(
# Tab 1
tabPanel("Upload File",
titlePanel("Upload your file"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Browse for your file')
),
mainPanel(
renderDataTable('contents')
)
)
),
tabPanel("Plot",
pageWithSidebar(
headerPanel('Example plot'),
sidebarPanel(),
mainPanel(
plotOutput('plotExample')
)
)
)
)
)
myDummyFun <- function(x){
x <- x %>%
filter(disp<=400)
return(x)
}
server <- function(input, output, server) {
observe({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
# I am really using the loaded file as input:
# d <- myDummyFun(inFile$datapath)
d <- myDummyFun(mtcars)
})
# datatable of data
output$contents <- DT::renderDataTable({
renderDataTable(d)
})
# tabPanel 1
output$plotExample <-renderPlot({
ggplot(d) +
geom_point(aes(disp, mpg))
})
}
shinyApp(ui = ui, server = server)
我的解析函数myDummyFun
实际上非常大,需要一段时间才能读取所选文件input$file1
,所以我想读取一次文件,然后返回数据每个绘图功能可访问的框架。
在此示例中, d
是本地范围的,因此renderDataTable(d)
或renderPlot
无法访问。组织这个的正确方法是什么?
答案 0 :(得分:1)
帮助观察?observe
说:
观察者就像一个反应性表达,因为它可以读取被动反应 值和调用反应式表达式,并将自动 当这些依赖关系发生变化时重新执行。但不像反应 表达式,它不会产生结果,也不能用作输入 其他反应性表达。因此,观察者只对其有用 它们的副作用(例如,执行I / O)。
答案here假设将output$something
调用嵌套在observe
结构中。
因此,我认为您的observe
应该是这样的:
observe({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
# I am really using the loaded file as input:
# d <- myDummyFun(inFile$datapath)
d <- myDummyFun(mtcars)
output$contents <- DT::renderDataTable({
renderDataTable(d)
})
# tabPanel 1
output$plotExample <-renderPlot({
ggplot(d) +
geom_point(aes(disp, mpg))
})
})
在评论if (is.null(inFile)) return(NULL)
部分时,此应用也会运行,情节看起来像
完整性,完整代码:
ui.R
library(shiny)
library(dplyr)
library(ggplot2)
data(mtcars)
fluidPage(
tabsetPanel(
# Tab 1
tabPanel("Upload File",
titlePanel("Upload your file"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Browse for your file')
),
mainPanel(
renderDataTable('contents')
)
)
),
tabPanel("Plot",
pageWithSidebar(
headerPanel('Example plot'),
sidebarPanel(),
mainPanel(
plotOutput('plotExample')
)
)
)
)
)
server.R
myDummyFun <- function(x){
x <- x %>%
filter(disp<=400)
return(x)
}
function(input, output, server) {
observe({
inFile <- input$file1
# if (is.null(inFile))
# return(NULL)
#
# I am really using the loaded file as input:
# d <- myDummyFun(inFile$datapath)
d <- myDummyFun(mtcars)
output$contents <- DT::renderDataTable({
renderDataTable(d)
})
# tabPanel 1
output$plotExample <-renderPlot({
ggplot(d) +
geom_point(aes(disp, mpg))
})
})
# datatable of data
}
希望这有帮助。