R 将行添加到shinyTable

R 将行添加到shinyTable,r,shiny,R,Shiny,我创建了一个有光泽的应用程序。它将csv文件读取为data.frame并保存更改或新行 如果我添加新行,它将被保存,但不会显示在表中。我只能在重新启动应用程序时看到表中的行。如何确保“提交”按钮在不重新启动应用程序的情况下添加行 编辑:我可以使用shiny和一个“普通”表生成此功能,该表具有renderable,但我无法使用shinyTable实现此功能 我基本上想要实现的是shinyTable的这个功能,它有一个可编辑的表,我可以在其中添加行 app.R require(shiny) data

我创建了一个有光泽的应用程序。它将csv文件读取为data.frame并保存更改或新行

如果我添加新行,它将被保存,但不会显示在表中。我只能在重新启动应用程序时看到表中的行。如何确保“提交”按钮在不重新启动应用程序的情况下添加行

编辑:我可以使用shiny和一个“普通”表生成此功能,该表具有
renderable
,但我无法使用shinyTable实现此功能

我基本上想要实现的是shinyTable的这个功能,它有一个可编辑的表,我可以在其中添加行

app.R

require(shiny)
datafile<-read.csv("data.csv", header=TRUE, sep=",", quote="")

runApp(
  list(
    ui = fluidPage(
      headerPanel('Title'),
      sidebarPanel(
    textInput("fielda", label="fielda", value=""),
    textInput("fieldb", label="fieldb", value=""),
    actionButton("addButton", "insert data")
      ),
      mainPanel(
    tableOutput("table"))
    ),

    server = function(input, output) {     
      datafile_sample <- datafile[sample(nrow(datafile)),]
      row.names(datafile_sample) <- NULL

      values <- reactiveValues()
      values$df <- datafile_sample
      addData <- observe({

    if(input$addButton > 0) {
      newLine <- isolate(c(input$fielda, input$fieldb))
      isolate(values$df <- rbind(as.matrix(values$df), unlist(newLine)))
      write.csv(values$df, file = "data.csv", row.names=F, quote=F)
    }
      })
      output$table <- renderTable({values$df}, include.rownames=F)
    }
  )
)

我想我会用不同的方式来处理这个问题。在编写示例时,不应在服务器外部调用由
read.csv
生成的数据帧。它本身应该是反应性的。在下面的代码中,我将它放在一个被动值调用中,并用
read.csv
初始化它

然后,向其中添加数据时,可以使用
write.table
将其添加到现有文件中,然后更新反应对象。无论使用哪种表格类型,都应将所有运动中的部件设置为自动更新?(我对shinyTable不太熟悉,所以没有做太多实验)

有几个变种,你可以采取这一点。首先,真的有必要将新数据写入文件吗?也许您可以使用
rbind
将新数据附加到现有数据框中。(相比之下,写/读组合的速度会很慢)

即使有必要写入新数据,也最好写入新数据并使用
rbind
更新应用程序中的数据框

图书馆(闪亮)


D我想我会用一点不同的方式来处理这个问题。在编写示例时,不应在服务器外部调用由
read.csv
生成的数据帧。它本身应该是反应性的。在下面的代码中,我将它放在一个被动值调用中,并用
read.csv
初始化它

然后,向其中添加数据时,可以使用
write.table
将其添加到现有文件中,然后更新反应对象。无论使用哪种表格类型,都应将所有运动中的部件设置为自动更新?(我对shinyTable不太熟悉,所以没有做太多实验)

有几个变种,你可以采取这一点。首先,真的有必要将新数据写入文件吗?也许您可以使用
rbind
将新数据附加到现有数据框中。(相比之下,写/读组合的速度会很慢)

即使有必要写入新数据,也最好写入新数据并使用
rbind
更新应用程序中的数据框

图书馆(闪亮)


D我试图回答这个问题,但我对server.R的所有部分都有点困惑。是否可以创建一个更简单的示例,只使用与您的问题相关的代码和一些示例数据?我试图用
shiny
,而不是
shinytable
,让它更清晰,最简单的工作示例。我试图回答这个问题,但我对server.R的所有部分都有点困惑。是否可以创建一个更简单的示例,只使用与您的问题相关的代码和一些示例数据?我试图用
shiny
,而不是
shinytable
,让它更清晰,是最简单的工作示例。
fielda,fieldb
1,2                                                               
3,4
D <- "fielda,fieldb\n1,2\n3,4"
write(D, file = "data.csv")

runApp(
  list(
    ui = fluidPage(
      headerPanel('Title'),
      sidebarPanel(
        textInput("fielda", label="fielda", value=""),
        textInput("fieldb", label="fieldb", value=""),
        actionButton("addButton", "insert data")
      ),
      mainPanel(
        tableOutput("table"))
    ),

    server = function(input, output) {     
      data <- reactiveValues(
        file = read.csv("data.csv", 
                        header=TRUE, 
                        sep=",", 
                        quote="")
      )

      addData <- observeEvent(
        input$addButton,
        {
          newLine <- data.frame(fielda = input$fielda, 
                                fieldb = input$fieldb)

          write.table(newLine, 
                    file = "data.csv", 
                    col.names = FALSE,
                    row.names=FALSE, 
                    quote=FALSE,
                    append = TRUE,
                    sep = ",")
          data$file <- read.csv("data.csv",
                                header=TRUE, 
                                sep=",", 
                                quote="")
        }
      )

      output$table <- 
        renderTable(data$file, include.rownames=FALSE)

    }
  )
)