2014-09-09 3 views
4

상당히 문제가 있습니다. 나는 상당히 다른 설정으로 프로그램을 실행하려고하는데, 이것은 Ui에서 설정할 수있다. 필자의 경우 사용자는 두 번 이상 같은 설정으로 프로그램을 실행해야 할 수도 있습니다. 내 문제는 UI를 새로 고치거나 다시 시작하면 모든 것이 기본값으로 설정된다는 것입니다. 예를 들어 :반짝이는 UI : 변경 사항을 입력에 저장하십시오.

numericInput("1", 
      label = h4("...."), 
             4, 
             min=1, 
             max=100, 
             step=1 
             ), 
          br(), 
          numericInput("2", 
             label = h4("..."), 
             1000000, 
             min=1, 
             max=100000000, 
             step=1 
             ) 

내가 7에 numericInput "1"로 설정하고,이 때문에 내가 이러한 설정의 상당수가 사실 4에서 기본적으로 될 프로그램을 다시 실행하면이 될 수 있습니다 꽤 뜬 소리. 그래서 내 질문은 : "내가 만든 변화를 저장하는 방법이 있습니까?"

감사합니다.

+0

최악의 시나리오는 사용자가'input $'과 (과) 상호 작용할 때마다 데이터베이스/로컬 파일에서 일관되고 서로 다른 세션간에 액세스 할 수있는 해당 선택 항목을 업데이트하겠습니까? –

+0

한 가지 옵션은 사용자가 책갈피로 저장할 수있는 입력 값을 URL에 기록하는 것입니다. 이를 구현하는 방법에 대한 자세한 내용은 [내 질문] (http://stackoverflow.com/questions/25306519/shiny-saving-url-state-subpages-and-tabs/25385474#25385474)을 참조하십시오.앱을 로컬로 제공하는 경우 URL이 유효 할 때마다 동일한 포트 번호로 runApp를 호출해야합니다. –

답변

5

이 까다로운 될 수 있습니다. 클라이언트 측 솔루션을 갖는 것이 가장 좋습니다. HTML5를 사용하면 로컬 저장소를 사용할 수 있습니다. 이 API에는 간단한 API가있는 많은 자바 스크립트 라이브러리가 있습니다. 나는 그 중 하나에 개념 증명으로 래퍼를 붙였다.

devtools::install_github("johndharrison/shinyStorage") 
library(shinyStorage) 
library(shiny) 

runApp(
    list(
    ui = fluidPage(
     addSS(), 
     uiOutput("textExample") 
    ) 
    , server = function(input, output, session){ 
     ss <- shinyStore(session = session) 
     output$textExample <- renderUI({ 
     myVar <- ss$get("myVar") 
     if(is.null(myVar)){ 
      textInput("textID", "Add some text to local storage") 
     }else{ 
      textInput("textID", "Add some text to local storage", myVar)   
     } 
     }) 

     observe({ 
     if(!is.null(input$textID)){ 
      if(input$textID != ""){ 
      ss$set("myVar", input$textID) 
      } 
     } 
     }) 
    } 
    ) 
) 

그래서 데모는별로 좋아 보이지 않는다. textInput 상자에 일부 텍스트를 입력하면 브라우저가 새로 고침되고 텍스트가 엉덩이를 떠올리게합니다. 이 접근법은 최대 10MB 크기의 객체와 같은 모든 R 목록에 대해 확장 될 수 있습니다. 나는 꾸러미에 관해 더 많이 고칠 것이다.

+0

+1 매우 멋진 ... –

3

다음은 세션에서 사용자 입력을 일관되게 유지하는 방법의 POC입니다.

DPUT 및 DGET은 두 가지 명령으로 작동합니다. 따라서 입력 변수의 값을 저장하는 로컬 파일로 끝납니다. 여기서는 입력 $ 데이터 집합 변수를 일관되게 만 만들고 있습니다. 나는 당신이 더 많은 변수를 가지고 있다면 더 많은 사전 명령이나 데이터베이스를 사용할 수 있다고 생각한다. 그러나 이것은 일하기 쉽다.

나는 server.R과 ui.R 사이의 몇 번의 반복 작업을했기 때문에 파일을 처음에 명령 줄을 통해 한 번 초기화하거나 일부 논리를 빌드해야 할 수도 있습니다. 파일이 존재하는지 여부를 확인하는 코드, 그렇지 않은 경우 일부 기본값이있는 새 파일을 작성하십시오.

server.R

shinyServer(function(input, output) { 

    datasetInput <- reactive({ 
    switch(input$dataset, 
      "rock" = rock, 
      "pressure" = pressure, 
      "cars" = cars) 
    }) 

    output$summary <- renderPrint({ 
    dataset <- datasetInput() 
    summary(dataset) 
    dput(input$dataset, "inputdata_dataset") 
    }) 

    output$view <- renderTable({ 
    head(datasetInput(), n = input$obs) 
    }) 
}) 

ui.R는

library(shiny) 
shinyUI(pageWithSidebar(
    headerPanel("Shiny Text"), 
    sidebarPanel(
    selectInput("dataset", "Choose a dataset:", 
       choices = c("rock", "pressure", "cars"), 
       selected = dget("inputdata_dataset")), 
    numericInput("obs", "Number of observations to view:", 10) 
), 
    mainPanel(
    verbatimTextOutput("summary"), 
    tableOutput("view") 
) 
)) 
+0

감사합니다. 나는 그것을 시도하고 나중에 당신과 나의 해결책 또는 나의 실패를 공유 할 것이다. – Richard

+0

여러 사용자가 사용할 수 없습니다. 여기에는 앱의 글로벌 사용자가 한 명 있다고 가정합니다. – jdharrison

+0

@jdharrison, 어쩌면 파일 이름 접두사'username_'을 가진 파일을 만드시겠습니까? 어떤 제안이 있으십니까? –

0

죄송합니다. 모든 해답을 가져 주셔서 감사합니다.

해결 방법을 찾았습니다. (코드의 관련 부분 만 게시 할 예정입니다.) conditionalpanel을 사용하여 해결책을 찾았습니다. 내 응용 프로그램에서 사용자는 계산을 시작하기 전에 설정을 정의해야하며, 먼저 저장해야한다는 것이 중요합니다 (다양한 이유, 주로 재현성). 그래서 계산의 각 단계에 대해 tabpanel을 만들었고 아주 간단한 해결책은 모든 tabpanel이 save 버튼에 의존한다는 것입니다. 결과는 사용자가 설정을 저장하기 전에 계산을 시작할 수 없다는 것입니다.

shinyUI(navbarPage(title=div(img(src="---", height=72, width=72, align="left")), theme ="bootstrap.css", fluid=T, 




       tabPanel("Startseite", 
tags$head(tags$script(HTML(' 
     Shiny.addCustomMessageHandler("jsCode", 
     function(message) { 
      console.log(message) 
      eval(message.code); 
     } 
    ); 
    '))), 

         actionButton("Ja", 
            label="Neue Berechnung beginnen", 
            icon("upload",lib="font-awesome")), 

         actionButton("Nein", 
            label="Bestehende Berechnung laden", 
            icon("upload",lib="font-awesome"))), 

       tabPanel("Einstellungen", progressInit(), 

         conditionalPanel(condition="input.Ja > 0", 

             wellPanel(actionButton("save", 
                   label="Einstellungen speichern", 
                   icon("save",lib="font-awesome") 
                   ), 
                br(), 
                br(), 
                navlistPanel("Einstellungen", 



tabPanel("Interne Kalibrierung", 
    conditionalPanel(condition="input.save> 0", 

         wellPanel(actionButton("freqbutton", "Frequenzschätzung durchführen"), 
           plotOutput("freqPlot") 
           ), 


             wellPanel(actionButton("intthresbutton", "Berechnung der internen Threshold"), 
               dataTableOutput("IntTable") 
               )) 


    ), 
관련 문제