2016-07-06 4 views
1

첫 번째 Shiny 응용 프로그램을 쓰고 있습니다. 코드의 요지는 csv 파일에서 읽는 것입니다. 사용자가 앱에서 일부 입력에 응답하고 해당 데이터가 csv 파일에 추가됩니다. 의도는이 파일이 매일 보관되고 앱이 내용을 업데이트한다는 것입니다. 이 파일은 나중에 분석을 위해 사용됩니다.Shiny 앱이 작동하기 위해 서로 다른 두 개의 데이터 프레임에서 어떻게 이름을 동일하게 만드나요?

처음 열 때 내 앱이 성공적으로이 작업을 수행합니다. 그러나 세션을 닫은 후 나중에 다시 사용하려면 (점심 식사 전에 앱을 닫고 점심 식사 후에 다시 여는 것을 상상해보십시오) "오류 : 이름이 이전 이름과 일치하지 않습니다."라는 이유로 CSV 파일을 더 이상 추가 할 수 없습니다.

먼저 log.csv라는 세 개의 열 (A, B, C)이있는 머리글 행이있는 "빈".csv 파일이 있습니다.

다음 코드를 사용하여 Shiny App을 만듭니다.

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는 C.

헤더 A, B 원래 빈 파일입니다

로그 dataframe의 이름이 반응 데이터에서 이름이 일치하지 않기 때문에 오류가 분명히 발생(). 일반 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) 

를 서버 섹션의 반응 데이터 문을 업데이트 (코드는 이미이 업데이트를 반영 위) . 앱을 닫았다가 다시 열 때 여전히 작동하지 않습니다. 이전 데이터가 로그에 가득 차 있다면 이름이 일치하지 않는 이유는 무엇인지 모릅니다.

감사합니다. 며칠 동안 고생하고 많은 게시물을 조사했습니다. 이것은 첫 번째 게시물이므로 제대로 따르지 않은 모든 예의를 용서해주십시오. 그러나 게시하거나 질문하는 데 더 적절한 방법으로 가볍게 누드 기쁘게 생각합니다.

답변

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) 
+0

빠른 응답을 가져 주셔서 감사합니다. 거의 작동합니다. 내가 좀 고칠 수 있는지 좀 더 둘러 볼거야. 좋은 소식 : 다시 열면 추락하지 않습니다. 나쁜 소식 : 추가 시간을 시작한 후 추가 할 때 모든 이전 데이터를 반복해서 추가합니다. 예를 들어 첫 번째 인스턴스에 3 회의 관측이 있고 앱이 종료 된 경우입니다. 앱의 다음 인스턴스에서는 앱을 1 회 사용하고 나면 이제 7 회의 관측이 이루어집니다 (처음 3 번, 처음 3 번 반복, 새로운 관측). 나는 계속 지키 겠지만, 해결책이 있다면 받아 들일 것입니다. 다시 한번 감사드립니다. –

+0

예 !!!!! D 조 감사드립니다! 이것은 효과가 있었다. 그런 다음 위의 내 문제에 더 대답하기 위해 rbind (log, t)는 어리석은 행동이었습니다. .csv에 append를 쓰는 작업이 이미 바인딩되었습니다. 다시 한 번 감사드립니다! –

+0

그걸 듣기 좋습니다! 답변이 도움이 되었다면 옆에있는 체크 표시를 클릭하여 답변을 수락 할 수 있습니다. –

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! 이제 다음 문제를 해결하십시오 ....

관련 문제