您如何在两个不同的数据框中使名称相同以使 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 应用程序正常工作?的主要内容,如果未能解决你的问题,请参考以下文章