在 R Shiny 中根据用户输入动态创建图像和表格

Dynamically Creating Images And Tables From User Input In R Shiny

我正在尝试在 R Shiny 中开发我的第一个应用程序,但到目前为止,我发现的示例一直在展示如何使用专有数据集(如 carot 或 mtcars),而不是如何有效地将数据加载到R 闪亮加工。

我想要做的是让 R shiny 根据用户的输入创建和加载不同的数据集,然后将该数据集显示为 table 并伴随可视化。

目前我尝试解决这个问题的方法列在下面的代码块中。 CreateSnapshotProduceTable 是用户定义的数据预处理函数,它们很长并且工作正常。

CreateSnapshot 正在提取原始数据并将其保存为 CSV。 ProduceTable 加载由 CreateSnapshot 创建的 CSV 并创建摘要 tables 和一个图形,然后在本地保存为 CSV 和 WMF分别

当我尝试 运行 应用程序时,服务器中的许多行试图加载摘要 table 并呈现它 运行。我似乎也无法让 R Shiny 加载由用户输入生成的 WMF。我试图用来渲染图像的代码已被删除,并且没有出现在下面的代码块中:

# Define UI for dataset viewer app ----
ui <- fluidPage(
  
  # App title ----
  titlePanel("FirstApp"),
  
  # Sidebar layout with input and output definitions ----
  sidebarLayout(
    
    # Sidebar panel for inputs ----
    sidebarPanel(
      
      # Input: Text for providing a caption ----
      # Note: Changes made to the caption in the textInput control
      # are updated in the output area immediately as you type
      # Input: Selector for choosing dataset ----
      selectInput(inputId = "dis",
                  label = "Choose a discipline:",
                  choices = c("Choice 1", "Choice 2", "Choice 3")),
      
    ),
    
    # Main panel for displaying outputs ----
    mainPanel(
    
      # Output: HTML table attempts ----
      tableOutput("view"),
      tableOutput("statstable"),
      tableOutput("VisData"),
      tableOutput("fileData"),
      imageOutput("preImage")
      
      
    )
  )
)

# Define server logic to summarize and view selected dataset ----
server <- function(input, output) {
  
#Creating Base Dataset
  Snapshot<-reactive({CreateSnapshot(input$dis)})
  #Creating Summary Dataset
  VisualizationTable<-reactive({ProduceTable(input$dis)})
  
#Attempting to create file from CSV files generated above.
  fileData <- reactive({reactiveFileReader(1000, NULL, paste( input$dis, date.of.data, 
                                                    "FilenameBoilerPlate.csv"), read.csv)})
  
  VisData<-renderDataTable(read.csv(paste( input$dis, date.of.data, 
                                                    "FileNameBoilerPlate.csv"), read.csv)))
  

  #Attempting to create outputs for viewing. I have discovered that the first two allow for my user defined functions to run and create all of the files I need.
  output$view <- renderTable({
    head(Snapshot())
  })
  
  output$statstable <- renderTable({
    head(VisualizationTable())
  })
  
  output$fileData <- renderTable({
    fileData()
  })

#Creating Image
  output$preImage <- renderImage({
    # When input$n is 3, filename is ./images/image3.jpeg
    filename <- normalizePath(file.path('./images', paste(input$dis, date.of.data, 
                                              "Superbarplot.wmf", sep=' ')))
    
    # Return a list containing the filename and alt text
    list(src = filename,
         alt = paste("Image Discipline", input$dis))
    
  }, deleteFile = FALSE)
}

# Create Shiny app ----
shinyApp(ui, server)

如有任何关于如何进行的想法,我们将不胜感激。

我会通过将您正在做的所有事情包装在一个 observeEvent 函数中来解决这个问题。我不认为响应式是尝试让你的函数达到 运行 的自然方式,因为它们更多的是在需要时返回 运行s 的 R 对象输出。

类似于:

observeEvent(输入$dis, { 快照 <- CreateSnapshot(input$dis)

VisualizationTable <- ProduceTable(input$dis)

fileData <- 您选择的读取函数,因为它不再需要反应

output$fileData <- renderTable({ 文件数据 })

等..

} )

所以每次用户选择一门学科时,整个事情都会 运行,生成你想要的输出。

如果您没有理由想要生成 csv,您可以通过不保存 csv 来进一步简化此过程,因为您保存它只是为了读取文件以加载它。