我下面有一个简单的闪亮应用程序。 在此应用程序中,我希望用户能够上传自己的csv,然后自动将其添加为另一个数据集“ DB”(我在原始应用程序中创建)下方的复选框组中的选择。 我通过使用观察者和一个在其中列出文件名的反应性列表来做到这一点。 新文件最初将具有其默认名称,但随后用户可以使用“设置文件名” textInput()将其更改为自己选择的名称。 然后,当用户选择文件时,它将显示为表格。 问题是我缺少某些东西,当我添加第二个文件时,第一个文件变成NA,并且没有显示任何表。

#ui.r
library(shiny)
library(rlist)
# Define UI for data upload app ----
ui <- fluidPage(

  # App title ----
  titlePanel("Uploading Files"),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

      # Input: Select a file ----
      fileInput("file1", "Choose CSV File",
                multiple = FALSE,
                accept = c("text/csv",
                           "text/comma-separated-values,text/plain",
                           ".csv")),
      uiOutput("checkbox"),
      uiOutput("text")

    ),

    # Main panel for displaying outputs ----
    mainPanel(

      # Output: Data file ----
      tableOutput("contents")

    )

  )
)
#server.r
server <- function(input, output) {
  output$text<-renderUI({
  textInput("filename","Set Filename",value = "Set Name")
  })
  New <- reactive({
    req(input$file1)
    df <- read.csv(input$file1$datapath)

  })

  D.B <- reactive({
    if("D.B"%in% input$datasetSelector){
    x <- read.csv("something.csv", stringsAsFactors = F)
    }
  })

  fileOptions <- reactiveValues(currentOptions=c("D.B."))

  observeEvent(input$file1, {
    fileOptions$currentOptions = list.append(fileOptions$currentOptions, "New")
  })
  output$checkbox<-renderUI({
    if(length(fileOptions$currentOptions)==1){
    checkboxGroupInput("datasetSelector","Specify the datasets to compare:", choices = fileOptions$currentOptions[[1]]
    )}
    else{
    names(fileOptions$currentOptions)[[2]]<-input$filename  
    checkboxGroupInput("datasetSelector","Specify the datasets to compare:", choices = fileOptions$currentOptions
   )}
  })
  output$contents <- renderTable({
    input$dataSelector
  })


}

#1楼 票数:1 已采纳

我必须检修服务器和ui才能使用内置的闪亮功能来简化此操作。 话虽如此,这可以满足您的所有需求。 请注意,这里我没有显示任何表格制作或数据处理,只是文件重命名和上传。

# Define UI for data upload app ----
ui <- fluidPage(

  # App title ----
  titlePanel("Uploading Files"),

   # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

       # Input: Select a file ----
       fileInput("file1", "Choose CSV File",
                multiple = FALSE,
                accept = c("text/csv",
                       "text/comma-separated-values,text/plain",
                       ".csv")),
      checkboxGroupInput("datasetSelector","Data Files", choices=c("D.B")),
      textInput("filename","Set Filename",value = "Set Name")

    ),

    # Main panel for displaying outputs ----
      mainPanel(

      # Output: Data file ----
      tableOutput("contents")

    ) 
  )
)
#server.r
server <- function(input, output, session) {

  observeEvent(input$filename, {

  req(input$file1)
  Name<-input$filename
  updateCheckboxGroupInput(session,"datasetSelector", choices=c("D.B",Name))
  })

  observeEvent(input$file1, {

    Data<-input$file1$datapath
    Name<-input$filename
    New <- read.csv(Data)
    updateCheckboxGroupInput(session,"datasetSelector", 
      choices=c("D.B",input$file1$name))
  })

  #Data proccesing code 
}

我使用了checkboxGroupInputtextInput ,它们是可以在UI中定义的闪亮输入。 这些设置了标准输入,并允许我们使用updateGroupCheckboxInput功能,这些功能无法在常规UI呈现中使用。 现在,我们可以观察到fileInputtextInput任何输入,并根据完成的时间运行代码。

用户上载文件时,复选框的名称将设置为上载的文件名。 当用户更改input$filename我们可以观察到并相应地更改复选框名称。 这样,无论何时上传新文件,它都会用上传中的新文件名覆盖现有的复选框名称,而该文件名又可以被文本字段的任何输入所覆盖。

摆脱反应式数据库,只需观察复选框中的任何输入,我们就可以根据选中的框数来简单地分配数据,因为如果选中了两个,则应该加载数据库和上载的文件。 如果选中一个,我们可以检查“ DB”的名称,分配的文件名或文本字段名称,并相应显示正确的文件。 仅在选中此复选框时,才始终加载数据库文件,而仅加载输入文件。 除非有一个上载的文件,否则没有复选框,因此该文件将覆盖我们。

#Data Processing Code
observeEvent(input$datasetSelector, {

  #Constant
  D.B<- read.csv("somthing.csv", stringsAsFactors = F)

  Selected<-input$datasetSelector
  L_Sel<-length(Selected)

  if(L_Sel==2){
    Data<-read.csv(input$file1$datapath)
    dataSelector<-list(Data,D.B)
    print("A")
  }else if(Selected=="D.B"){
    dataSelector<-D.B
    print("B")
  }else if(Selected==input$file1$name|Selected==input$filename){
    Data<-read.csv(input$file1$datapath)
    dataSelector<-Data
    print(Data)
    print("C")
  }else{
    dataSelector=NA
  }

  output$contents<-renderTable({
    dataSelector
  })

  })

请注意,我们还将输出也放置在复选框的observeEvent下,因此除非您在部署时为复选框设置了选定的值,否则不会初始化任何表。 我不确定您如何显示两个表,这将需要一些工作,但是仅在复选框的if / statement和observeEvent中工作。

该程序知道何时选中两个复选框并列出两个文件/数据的列表,但是我不确定您打算如何显示它们。 您可能希望将该工作包括在if(L_Sel==2){..}部分下。

  ask by firmo23 translate from so

未解决问题?本站智能推荐:

1回复

如何让用户可以在闪亮的应用程序中上传多个文件?

我知道我必须使用 fileInput 函数,但我希望用户能够只上传一个、两个、三个或多个文件,然后对这些文件执行底层代码。 然后我希望用户能够下载生成的文件,但我想我知道该怎么做。 提前感谢您的任何答案。
1回复

如何处理在闪亮的应用程序中上载和重命名的文件

我下面有一个简单的闪亮应用程序。 在此应用程序中,我希望用户能够上传自己的csv,然后自动将其添加为另一个数据集“ DB”(我在原始应用程序中创建)下方的复选框组中的选择。 然后,当用户选择文件时,它将显示为表格。 在这里,我设法重命名了上载的文件。 但是,在保持“更改名称”功能的同
1回复

只有在闪亮的应用程序中的其他 tabPanel 中上传数据后才移动到其他 tabPanels

我在下面有一个闪亮的应用程序,用户可以在其中登陆Upload data面板。 如果用户没有Upload data选项卡中所需的两个文件,我希望用户无法移动到其他 2 个选项卡tabpanels任何一个。
1回复

闪亮的应用程序以不同的设置开始

假设我有一个闪亮的应用程序: 此应用程序仅根据输入绘制红色或蓝色正方形。 现在,我想在我的网站上使用此应用程序,在这里我想有两个链接:“红色应用程序”链接,它将打开默认选项设置为“红色”的应用程序,以及“蓝色应用程序”链接,这将打开默认设置为“蓝色”的应用程序。 除此之外,两种情况下
1回复

在闪亮的应用程序的两个或多个列中排列textInput元素

现在,Shiny GUI看起来如图所示。 我想优化sidebarPanel中两列或更多列中(> 30) textInput元素的空间和排列 。 如何使用textInput元素设置两列-是否可以使用表类型? 如何更改textInput height ,可以看到只能编辑'widt
1回复

r-空的textInput()在小册子闪亮的应用程序中导致错误

我有一个闪亮的应用程序,可以在传单地图上绘制来自API的数据。 它还从用户那里获取2个输入,这些输入将传递给API call 。 其中之一是文本输入,用于设置API应该为其提取数据的区域。 如果用户输入了不正确的区域代码或只是删除了该代码,闪亮的应用程序将显示错误消息,然后您必须输入正
1回复

在闪亮的应用程序中设置xlim for rbokeh plot

我正在使用r的rbokeh包 。 我已经将一些好的结果整合到一个闪亮的应用程序中。 我现在要集成一个功能,其中dateRangeInput现在将选择图表的日期范围(它是时间序列数据)。 以上是示例数据,但它在rbokeh :: figure中没有xlim参数的情况下工作,因为在输入子
2回复

将包含多个文件的zip文件上传到闪亮的应用程序中

我试图通过我的闪亮应用程序上传一个zip文件,其中包含一堆xml文件,然后对其进行处理。 我的代码如下所示: 在尝试解压缩文件的第一步,我已经收到一个错误: 有人对我该如何解决有任何想法吗? UPD:通过将input$upload更改为input$upload$datap