R 使用反应性生成的闪亮对象作为另一个反应性事件的输入
我的闪亮应用程序使用R 使用反应性生成的闪亮对象作为另一个反应性事件的输入,r,shiny,dt,R,Shiny,Dt,我的闪亮应用程序使用DT库呈现动态数据帧。用户可以通过单击来选择所需的行。选择行后,应用程序将以数据帧的形式显示并下载转置的行。但是,在这样做(显示和下载)时,我遇到了如下错误- 错误 警告:[.data.frame:选择了未定义的列[No stack trace available]时出错。 下面是详细的步骤 获取的数据(比如从某个网站获取的数据) 用户通过单击行来选择行,然后单击actionButton()将它们标记为“第一组” 用户清除之前的选择并重复与“步骤-2”相同的步骤来创建第二个组
DT
库呈现动态数据帧。用户可以通过单击来选择所需的行。选择行后,应用程序将以数据帧的形式显示并下载转置的行。但是,在这样做(显示和下载)时,我遇到了如下错误-
错误
警告:[.data.frame:选择了未定义的列[No stack trace available]时出错。
下面是详细的步骤
actionButton()
将它们标记为“第一组”row.names()
对数据框进行子集化库(闪亮)
图书馆(DT)
temp_func您的子集设置错误;g1
和g2
是行名,但您在需要列名的子集中使用了它(因此您得到了错误消息)。因此,我更改了clean
函数。由于没有堆栈跟踪,因此您的错误消息信息量不大。如果您想获取堆栈跟踪,应使用RStudio中的闪亮应用程序模板(请参见6.2.1末尾)。这样,我就可以
Warnung: Error in [.data.frame: undefined columns selected
78: stop
77: [.data.frame
75: subset.data.frame
73: clean [C:\Users\jhage\Documents\Programmierung\Shiny_tests\app_2\shinytest7/app.R#12]
72: observeEventHandler [C:\Users\jhage\Documents\Programmierung\Shiny_tests\app_2\shinytest7/app.R#63]
1: runApp
因此,调试更容易
更正后的代码:
library(shiny)
library(DT)
temp_func <- function(){
x <- mtcars
y = x[,1]
return(list(complete_df = as.data.frame(x), column1 = as.data.frame(y)))
}
clean <- function(df, g1, g2){
df_selection <- df[c(which(rownames(df) == g1), which(rownames(df) == g2)), ]
df_new <- t(df_selection)
return(as.data.frame(df_new))
}
# UI
ui <- shinyUI({
fluidPage(
actionButton("fetch", label = "Step1-Fetch data first"),
DT::dataTableOutput("table"),br(),
tags$h5("Selected for Group-1"), verbatimTextOutput("Group1"),br(),
tags$h5("Selected for Group-2"),verbatimTextOutput("Group2"),hr(),br(),
tags$h4("Follow Steps: "),
actionButton("selG1", label = "Step-2: Mark as Group-1"),
actionButton("clear", label = "Step-3: Clear Selection"),
actionButton("selG2", label = "Step-4: Mark as Group-2"),
actionButton("cleanIt", "Step-5: Clean Dataframe"),
DT::dataTableOutput("table2"),
downloadButton("down", "Step-6: Download cleaned dataframe")
)})
# Server
server <- Main_Server <- function(input,output,session){
# Reactive Values
values <- reactiveValues(table = NULL)
group1 <- reactiveValues(Group1 = NULL)
group2 <- reactiveValues(Group2 = NULL)
clean_df <- reactiveValues(df = NULL)
# fetchEvent (Consider temp_func() is fetching data from website)
observeEvent(input$fetch, {values$table <- temp_func()})
# Rendering table for display
output$table <- renderDT({datatable(values$table$complete_df)})
# Selection Event (Gorup1)
observeEvent(input$selG1, {group1$Group1 <- rownames(values$table$complete_df[as.numeric(input$table_rows_selected),])})
# Reset selections
observeEvent(input$clear, {output$table <- renderDT({datatable(values$table$complete_df)})})
# Selection Event (Gorup1)
observeEvent(input$selG2, {group2$Group2 <- rownames(values$table$complete_df[as.numeric(input$table_rows_selected),])})
# Print Events
output$Group1 <- renderPrint({group1$Group1})
output$Group2 <- renderPrint({group2$Group2})
# observeEvent
observeEvent(input$cleanIt, {clean_df$df <- clean(values$table$complete_df, group1$Group1, group2$Group2)
})
# Rendering table for display
output$table2 <- renderDT({datatable(clean_df$df$df_new)})
# Combined Download
output$down <- downloadHandler(
filename = function() { "File.csv"},
content = function(file) {write.csv(clean_df$df$df_new, file)})
}
# Run-app
shinyApp(ui, server)
库(闪亮)
图书馆(DT)
临时函数
library(shiny)
library(DT)
temp_func <- function(){
x <- mtcars
y = x[,1]
return(list(complete_df = as.data.frame(x), column1 = as.data.frame(y)))
}
clean <- function(df, g1, g2){
df_selection <- df[c(which(rownames(df) == g1), which(rownames(df) == g2)), ]
df_new <- t(df_selection)
return(as.data.frame(df_new))
}
# UI
ui <- shinyUI({
fluidPage(
actionButton("fetch", label = "Step1-Fetch data first"),
DT::dataTableOutput("table"),br(),
tags$h5("Selected for Group-1"), verbatimTextOutput("Group1"),br(),
tags$h5("Selected for Group-2"),verbatimTextOutput("Group2"),hr(),br(),
tags$h4("Follow Steps: "),
actionButton("selG1", label = "Step-2: Mark as Group-1"),
actionButton("clear", label = "Step-3: Clear Selection"),
actionButton("selG2", label = "Step-4: Mark as Group-2"),
actionButton("cleanIt", "Step-5: Clean Dataframe"),
DT::dataTableOutput("table2"),
downloadButton("down", "Step-6: Download cleaned dataframe")
)})
# Server
server <- Main_Server <- function(input,output,session){
# Reactive Values
values <- reactiveValues(table = NULL)
group1 <- reactiveValues(Group1 = NULL)
group2 <- reactiveValues(Group2 = NULL)
clean_df <- reactiveValues(df = NULL)
# fetchEvent (Consider temp_func() is fetching data from website)
observeEvent(input$fetch, {values$table <- temp_func()})
# Rendering table for display
output$table <- renderDT({datatable(values$table$complete_df)})
# Selection Event (Gorup1)
observeEvent(input$selG1, {group1$Group1 <- rownames(values$table$complete_df[as.numeric(input$table_rows_selected),])})
# Reset selections
observeEvent(input$clear, {output$table <- renderDT({datatable(values$table$complete_df)})})
# Selection Event (Gorup1)
observeEvent(input$selG2, {group2$Group2 <- rownames(values$table$complete_df[as.numeric(input$table_rows_selected),])})
# Print Events
output$Group1 <- renderPrint({group1$Group1})
output$Group2 <- renderPrint({group2$Group2})
# observeEvent
observeEvent(input$cleanIt, {clean_df$df <- clean(values$table$complete_df, group1$Group1, group2$Group2)
})
# Rendering table for display
output$table2 <- renderDT({datatable(clean_df$df$df_new)})
# Combined Download
output$down <- downloadHandler(
filename = function() { "File.csv"},
content = function(file) {write.csv(clean_df$df$df_new, file)})
}
# Run-app
shinyApp(ui, server)