我正在尝试弄清楚如何获得data.frame
对其自身进行子集化,然后为每个子集编写一个 .csv 文件。我正在写一个shiny
应用程序将为不同的仪器生成模板文件,我需要能够为每个批次/板/任何内容获取一个文件。显然,我们可以进行手动排序,但这违背了目的。
例如,假设我有一个data.frame
有 4 列,分别命名为 1) PlateID、2) SampleName、3) Well 和 4) Comments,我想按 PlateID 进行子集化,以便每个单独的板都有自己的文件。
output$multiDownload <- renderText({
#templateData() just loads the data, nothing special;
#If you wanna see it let me know, but I think it's bulky
tempData <- templateData()
if(is.null(tempData)){return(NULL)}
#If there are more than one plate, subset by plate ID and write each file
if(max(tempData$PlateID) > 1){
for(i in 1:max(tempData$PlateID)){
tempSubsetForWrite <- subset(tempData, tempData$PlateID == i, select = c("names", "well", "comments"))
write.csv(tempSubsetForWrite, file = paste0("file ", i, " of ", max(tempData$PlateID), row.names = FALSE)
}
} else {
write.csv(tempData, file = "file", row.names = FALSE)
}
})
所以我想添加一些功能,但我不知道如何实现它们。首先,我希望更好地控制数据写入的位置。我希望它与我的输入文件进入同一个文件,但我不确定如何强制执行此操作?我尝试做类似的事情:
inFile <- input$templateGenerationFile
write.csv(tempData, paste0(inFile$datapath, "/file ", i, " of ", max(tempData$PlateID))
but in inFile$datapath
似乎是生成的临时文件夹/文件,而不是原始文件的直接链接!
另外,我想写一些像downloadHandler
从某种意义上说,有一个按钮可以在单击时下载文件,但我认为在这种情况下我不能使用它,因为我正在编写多个文件。如果我错了,请告诉我,因为这会让生活更轻松。我想我会使用actionButton
和一个计数器变量,以便计数器是按钮的值 + 1,直到按钮被激活,在这种情况下,它们在函数结束之前相等。显然,我会有一个处理其余部分的条件,但这很简单,所以让我们专注于文件子集并下载!
Thanks!