Shiny的新手,我正在尝试创建一个遵循以下事件序列的非常简单的应用程序:
(1)上传一个数据框,
(2)等到用户设置过滤参数(在下面的示例中为Category
)
(3)按下Go!
按钮,
(4)显示子数据帧的第一行。
假设我有一个文件df.tab
要上传和处理。
df <- data.frame(Category=c("A","A","A","B","B","B"), X=c(1,2,3,1,2,3), Y=c(1,2,3,34,21,1))
df
Category X Y
1 A 1 1
2 A 2 2
3 A 3 3
4 B 1 34
5 B 2 21
6 B 3 1
write.table(df, file="df.tab", row.names=F, quote=F, sep="\t")
我的app.R
如下:
library(shiny)
# Define UI ----
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
fileInput("input_df",label=h4("Dataset")),
selectInput("category",h4("Category"), choices = list("A" = 1,"B" = 2),selected = 1),
actionButton("goButton",label = "Go!")
),
mainPanel(
tableOutput("view")
)
)
)
# Define server logic ----
server <- function(input, output) {
data <- eventReactive(
input$input_df,
{
File <- input$input_df
if(is.null(File)){
return(NULL)
}else{
df <- read.table(File$datapath, header = T, sep = "\t")
}
}
)
data_sub <- eventReactive(
input$category,
{
df_sub <- subset(data(), Category == input$category)
}
)
output$view <- renderTable(
{
head(data_sub())
}
)
}
# Run the app ----
shinyApp(ui = ui, server = server)
但是,该应用程序没有响应或不显示任何行。
请注意,我创建了2个不同的反应性事件data
和data_sub
,以避免每次我选择其他类别时都加载文件(并可能避免使用递归函数引起的堆栈错误)。 / p>
任何帮助将不胜感激。
答案 0 :(得分:0)
这是一个有效的server
函数。使用reactive
而不是eventReactive
,这非常简单。
请注意,您的示例假设您具有“类别”列,我在下面进行了修改以使其适用于所有内容。
# Define server logic ----
server <- function(input, output) {
dataset <- reactive({
File <- input$input_df
req(File)
read.table(File$datapath, header = TRUE, sep = "\t")
})
data_sub <- reactive({
if("Category" %in% names(dataset())){
subset(dataset(), Category == input$category)
} else {
dataset()
}
})
output$view <- renderTable({
head(data_sub())
})
}