我想制作一个shinyapp,它集成了选择文件(在选定的文件夹中)的功能(如在Interactive directory input in Shiny app (R)中),然后通过检测其中的变化来反应性地读取它,如{{ 3}}。
但是,我无法使reactiveFileReader函数与反应文件名(文件夹)一起工作。它似乎仅适用于一个预定义的文件名。
在这个应用程序中,文件应该在选择任何文件夹(按钮)后自动选择,前提是它在里面且具有相同的名称例如,如果您选择/ home / name /文件夹,则所选文件应为/home/name/folder/folder.csv。以下是不带代码的代码/ home / name / folder预期的功能。它显示了一个示例文件。
server<- function(input, output, session) {
shinyDirChoose(input, 'dir', roots = c(home = path1) )
reacdir <- reactive(input$dir)
output$dirtext <- renderPrint(c(path(),current() ) )
path1<-"~"
path <- reactive({
home <- normalizePath(path1)
file.path(home, paste(unlist(reacdir()$path[-1]), collapse = .Platform$file.sep))
})
current<-reactive({
a<-sub('.*\\/', '', path() )
b<-paste("current subdir:",a)
})
# logfilename<- reactive({filename<-paste0(path(),"/",sub('.*\\/', '', path() ),".csv")})
logfilename <- paste0('logfile',
floor(runif(1, 1e+05, 1e+06 - 1)),".txt")
#
logwriter <- observe({
invalidateLater(1000, session)
cat(as.character(Sys.time()), '\n', file = logfilename,
append = TRUE)
})
fileReaderData <- reactiveFileReader(500, session,
logfilename, readLines)
# when using logfilename(): You tried to do something that can only be done from inside a reactive expression or observer.
# Also not working: fileReaderData <- reactive({file<-reactiveFileReader(500, session,
# logfilename(), readLines) })
output$fileReaderText <- renderText({
text <- fileReaderData()
length(text) <- 14
text[is.na(text)] <- ""
paste(text, collapse = '\n')
})
}
ui<-fluidPage(
titlePanel("interactive selection of file and reactive reading"),
fluidRow(
column(12,
shinyDirButton("dir", "1. Choose directory", "Upload")
,br(),br(),
p("This app has a log file which is appended to",
"every second.")
)
),
fluidRow(
column(6, wellPanel(
verbatimTextOutput("fileReaderText")
))
)
)
shinyApp(ui, server)
答案 0 :(得分:2)
我来到这个解决方案。测试外部修改/folder/folder.csv文件。
library(shiny)
library(shinyFiles)
path1<-"~"
server<- function(input, output, session) {
shinyDirChoose(input, 'dir', roots = c(home = path1) )
reacdir <- reactive(input$dir)
output$dirtext <- renderPrint(c(path(),current() ) )
path <- reactive({
home <- normalizePath(path1)
file.path(home, paste(unlist(reacdir()$path[-1]), collapse = .Platform$file.sep))
})
current<-reactive({
a<-sub('.*\\/', '', path() )
b<-paste("current subdir:",a)
})
reac<-reactiveValues()
observe({
if(file.exists(paste0(path(),"/",sub('.*\\/', '', path() ),".csv")) ){
fileReaderData<-reactiveFileReader(1000, session, paste0(path(),"/",sub('.*\\/', '', path() ),".csv"), read.csv, stringsAsFactors=FALSE)
reac$df<-fileReaderData()
output$fileReaderText <- renderText({
text <- reac$df
length(text) <- 14
text[is.na(text)] <- ""
paste(text, collapse = '\n')
})
}
else{"index file does not exist, create with button 2."}
}
)
}
ui<-fluidPage(
titlePanel("interactive selection of file and reactive reading"),
fluidRow(
column(12,
shinyDirButton("dir", "1. Choose directory", "Upload")
,br(),br(),
p("shinyapp")
)
),
fluidRow(
column(6, wellPanel(
verbatimTextOutput("fileReaderText")
))
)
)
shinyApp(ui, server)