您如何在两个不同的数据框中使名称相同以使 Shiny 应用程序正常工作?

Posted

技术标签:

【中文标题】您如何在两个不同的数据框中使名称相同以使 Shiny 应用程序正常工作?【英文标题】:How do you make names the same in two different dataframes for Shiny app to work? 【发布时间】:2016-11-08 21:09:01 【问题描述】:

我正在编写我的第一个 Shiny 应用程序。代码的要点是读取 csv 文件,用户回答来自应用程序的一些输入,然后将这些数据附加到 csv 文件中。目的是每天保存此文件,并且应用程序会更新内容。该文件稍后将用于分析。

我的应用在第一次打开时就成功了。但是,当会话关闭然后重新打开以供以后使用(想象在午餐前关闭应用程序,然后在午餐后重新打开)时,由于“错误:名称与以前的名称不匹配”而无法再附加 CSV 文件

我首先有一个“空”的 .csv,它只有一个标题行,包含三列(A、B、C),称为 log.csv。

然后我使用以下代码创建闪亮的应用程序。

library(shiny)

ui <- fluidPage(

  # Application title
  titlePanel("My 1st App"),

  #Enter Agent
  selectInput(inputId = "a", "A", c("Choose one" = "","A1", "A2", "A3"),
         multiple = FALSE, selectize = TRUE, width = NULL, size = NULL),

  #Enter Concentration
  numericInput(inputId = "b", "Favorite Number", NULL, min = 0, max = NA),

  #Enter Detection
  radioButtons(inputId = "c", "Are you Happy Y/N", c("Y", "N")),
  actionButton(inputId = "submit", "Submit", icon = NULL, width = NULL),
  verbatimTextOutput("summary"),

  log <- read.table("V:\\My\\Path\\log.csv",sep=",",header=T)

)


server <- function(input, output) 
    data <- eventReactive(input$submit,          
        t <- cbind(input$agent,input$conc, input$detect)
        names(t) <- c("A","B","C")
        t         
  )


     output$summary <- renderPrint(data() #outputs data in allotted field.

       write.table(rbind(log,data()), file="V:\\My\\Path\\log.csv", sep=",",
                             col.names= FALSE, row.names=F, append = T)
      ) 


shinyApp(ui = ui, server = server)'

log.csv 是带有标题 A、B、C 的原始空白文件。

错误显然是因为日志数据框中的名称与反应数据()中的名称不匹配。

在纯 R 中,我可以使用以下代码解决问题:

log <- data.frame(read.table("V:\\My\\Path\\log.csv",sep=",",header=T))
names(log)

a <- c("A1", "A3", "A2")
b <- c(0,1,2)
c <- c("y","n","n")
t <- data.frame(cbind(a,b, c))
names(t) <- c("A","B","C")
t
rbind(log,t)

因此,我尝试使用此逻辑并更新了服务器部分中的响应式数据语句(上面的代码已经反映了此更新)。当应用程序关闭并重新打开时,它仍然不起作用。我不知道在日志中填写以前的数据会使名称不匹配怎么办。

感谢您的帮助。我挣扎了好几天,研究了很多帖子。这是我的第一篇文章,所以请原谅我没有正确遵守的任何礼仪。不过,我很高兴有人轻轻地推动我采用更合适的方式发帖或提问。

【问题讨论】:

【参考方案1】:

对于其他可能关注的人,我将发布最终解决方案。如果没有 D. Alburez 的答复,这是不可能做到的。我稍微修改了他的代码以获得我正在寻找的答案。

library(shiny)
path <- "your path"
log <- read.csv(paste0(path,"log.csv"))

ui <- fluidPage(

  # Application title
  titlePanel("My 1st App"),

  #Enter Agent
  selectInput(inputId = "a", "A", c("Choose one" = "","A1", "A2", "A3"),
          multiple = FALSE, selectize = TRUE, width = NULL, size = NULL),

  #Enter Concentration
  numericInput(inputId = "b", "Favorite Number", NULL, min = 0, max = NA),

  #Enter Detection
  radioButtons(inputId = "c", "Are you Happy Y/N", c("Y", "N")),
  actionButton(inputId = "submit", "Submit", icon = NULL, width = NULL)
)

server <- function(input, output) 

  observeEvent(input$submit, 
    data <- data.frame(A= input$a, B = input$b, C= input$c)
    write.table(data, file=paste0(path,"log.csv"), sep=",",
                col.names= FALSE, row.names=F, append = T)
  )


shinyApp(ui = ui, server = server)

再次感谢 D!现在开始下一个问题......

【讨论】:

【参考方案2】:

如果您的应用不需要输出,也许您可​​以尝试使用observeEvent。 (我修改了一点代码,让我更容易,但想法是一样的)。

library(shiny)
path <- "your path"
log <- read.csv(paste0(path,"log.csv"))

ui <- fluidPage(

  # Application title
  titlePanel("My 1st App"),

  #Enter Agent
  selectInput(inputId = "a", "A", c("Choose one" = "","A1", "A2", "A3"),
          multiple = FALSE, selectize = TRUE, width = NULL, size = NULL),

  #Enter Concentration
  numericInput(inputId = "b", "Favorite Number", NULL, min = 0, max = NA),

  #Enter Detection
  radioButtons(inputId = "c", "Are you Happy Y/N", c("Y", "N")),
  actionButton(inputId = "submit", "Submit", icon = NULL, width = NULL)
)

server <- function(input, output) 

  observeEvent(input$submit, 
    t <- data.frame(A= input$a, B = input$b, C= input$c)
    data <- rbind(log,t)
    write.csv(data, file=paste0(path,"log.csv"),row.names=F)
  )


shinyApp(ui = ui, server = server)

【讨论】:

感谢您的快速回复。这几乎可以工作。我会再弄乱一些,看看我能不能解决。好消息:再次打开时它不会崩溃。坏消息:在打开额外的时间后,追加时,它会一遍又一遍地追加所有以前的数据。例如,如果在第一个实例中有 3 个观察值并且应用程序已关闭。在应用程序的下一个实例中,在应用程序的 1 次新使用后,现在有 7 个观察值(前 3 个,前 3 个重复,以及新的观察值)。我会坚持下去,但如果你有解决方案,我会接受。再次感谢。 是的!!!!谢谢D!这行得通。然后为了进一步回答我上面的问题,rbind(log,t) 很愚蠢。使用 append 写入 .csv 已经绑定了它。再次感谢! 很高兴听到这个消息!如果答案有帮助,您可以点击旁边的复选标记接受它。

以上是关于您如何在两个不同的数据框中使名称相同以使 Shiny 应用程序正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何基于相同的 ID 比较两个不同数据框中的日期列

pandas:合并两个不同名称的列?

如何在轮播中使横向和纵向图像完全响应且高度相同?

如何删除所有重复项以使 NONE 留在数据框中?

如何在 C++ 中使 csv 文件运行得更快

从值不同的两个数据框中获取列