2015-12-05 5 views
1

Мое блестящее приложение на сервере и генерирует в локальной папке текстовые файлы (различный контент, одинаковое имя файла) каждый раз, когда пользователь использует приложение. Я обеспокоен тем, что, когда несколько пользователей используют приложение, экспортируемые текстовые файлы могут конфликтовать, так как местоположение и имя файла текстовых файлов одинаковы.R shiny-server: пользовательский каталог для каждого сеанса

Чтобы избежать этой возможности, я думаю о направлении создания каталога, когда пользователь запускает сеанс, все рабочие файлы экспортируются в этот каталог, а когда сеанс закрыт, каталог должен быть удален.

Любые идеи о том, как это сделать? Есть ли лучшие солутоны? Как определить, когда сессия закрылась? Как узнать количество активных сеансов?

ответ

1

Это работает правильно в блестящей серверной среде, а также на shinyapps.io. Рабочий пример Тарифа Кавафа.

ui.R

#ui.R 
shinyUI(fluidPage(
    headerPanel("New directory issue"), 
    wellPanel(
    helpText("I would like a new directory to be created each time a new connection is made to the app OR anytime new files are uploaded."), 
    helpText("This app uploads one text file, creates a new directory, extracts first 5 lines and exports a text file with the contents."), 
    helpText("Upload one text file with minimum 5 lines of content."), 
    fileInput('upload', label=h4('Upload file(s):'), multiple=FALSE) 
), 
    mainPanel(
    tags$h3("Str of uploaded content"), 
    verbatimTextOutput('display') 
) 
)) 

server.R

#server.R 

#Get current wd and print 
currwd <- getwd() 

#FUNCTION - new directory 
fn_dir <- function(currwd=NULL) 
{ 
    if(is.null(currwd)) stop("Argument 'currwd' is empty.\n") 

    #Create new working directory 
    newwd <- paste0(currwd,"/",format(Sys.time(),"%Y%m%d%H%M%S")) 
    dir.create(newwd) 
    newwd 
} 

shinyServer(function(input, output) { 

    #REACTIVE - store 
    store <- reactiveValues(currwd = currwd) 

    #REACTIVE - complete input 
    fn_getfilenames <- reactive({ 
    inputdata <- input$upload 

    if (!is.null(inputdata)) 
    { 
     store$newwd <- fn_dir(store$currwd) 
     return(inputdata) 
    }else{ 
     return(NULL) 
    } 
    }) 

    #OUTPUT 
    output$display <- renderPrint({ 
    if (is.null(fn_getfilenames())) return(NULL) 

    inputdata <- fn_getfilenames() 

    #some stuff to export to working directory 

    rcontent <- as.vector(scan(file = inputdata$datapath,what = "text",n = 10)) 

    full_file_path <- file.path(store$newwd,inputdata$name) 
    write(x = rcontent, file = paste0(full_file_path,"-test.txt")) 

    return(str(inputdata)) 
    }) 
}) 
+0

Что делать, если два пользователя получить доступ к серверу в ту же секунду? Это вполне возможно. – dracodoc

+0

Добавить дополнительные случайные числа. – rmf

+1

Я нашел, что вы также можете использовать токен сессии $, который зависит от сеанса. – dracodoc

 Смежные вопросы

  • Нет связанных вопросов^_^