2014-06-11 3 views
0

그래서 함수 내 입력을 나열하는 데 약간의 문제가 있습니다 (특히 ezANOVA()).ezANOVA 입력이 Shiny

ui.R : 내가 지금까지 코드를 가지고있는 다음은

library(shiny) 

shinyUI(pageWithSidebar(

    headerPanel('Analysis of Variance'), 

    sidebarPanel(

    fileInput("file1", "CSV File", accept=c("text/csv", "text/comma-separated-values,text/plain", ".csv")), 

    checkboxInput("header", "Header", TRUE), 

    radioButtons('sep', 'Separator',c(Comma=',',Semicolon=';',Tab='\t'),','), 

    uiOutput('var') 
), 

    mainPanel( 

    tableOutput('aovSummary') 

) 
) 
) 

server.R :

: 여기
library(shiny) 
library(ez) 

shinyServer(function(input, output) { 

    csvfile <- reactive({ 
    csvfile <- input$file1 
    if (is.null(csvfile)){return(NULL)} 
    dt <- read.csv(csvfile$datapath, header=input$header, sep=input$sep) 
    dt 
    }) 

    output$var <- renderUI({ 
    if(is.null(input$file1$datapath)){return()} 

    else{ 
     return(list(radioButtons("estimate", "Please Pick The Dependent Variable", choices = names(csvfile())), 
       radioButtons("between1", "Please Pick The Between Subjects Factor", choices = names(csvfile())), 
       radioButtons("within1", "Please Pick The Within Subjects Factor", choices = names(csvfile())), 
       radioButtons("sid", "Please Pick The Subject Id Variable", choices = names(csvfile())), 
       actionButton("submit", "Submit"))) 
    } 

}) 


output$aovSummary = renderTable({ 

    if(is.null(input$file1$datapath)){return()} 

    if(input$submit > 0){ 

    aov.out <- ezANOVA(data = csvfile(), dv = .(input$estimate), wid = .(input$sid), between = .(input$between1), 
        within = .(input$within1), detailed = TRUE, type = "III") 
    return(aov.out) 

    } 
}) 
}) 

내가 그것을 데이터 테스트되고있다
Animal Visit Dose Estimate 
    2556 0 3 1.813206946 
    2557 0 3 1.933397744 
    2558 0 3 1.689893603 
    2559 0 3 1.780301984 
2560 0 3 1.654374476 
2566 0 10 3.401283412 
2567 0 10 3.015958525 
2568 0 10 2.808705611 
2569 0 10 3.185718418 
2570 0 10 2.767128836 
2576 0 30 3.941412617 
2577 0 30 3.793328436 
2578 0 30 4.240736154 
2579 0 30 3.859611218 
2580 0 30 4.049743097 
2586 0 100 5.600261483 
2587 0 100 5.588115651 
2588 0 100 5.089081008 
2589 0 100 5.108262681 
2590 0 100 5.343876403 
2556 27 3 1.453587471 
2557 27 3 1.994413484 
2558 27 3 1.638132168 
2559 27 3 2.138289747 
2560 27 3 1.799769874 
2566 27 10 3.302851871 
2567 27 10 3.014199997 
2568 27 10 3.190990162 
2569 27 10 3.577924375 
2570 27 10 3.537461068 
2576 27 30 4.470837132 
2577 27 30 4.081833308 
2578 27 30 4.497192825 
2579 27 30 4.205494309 
2580 27 30 4.234496088 
2586 27 100 6.054284369 
2587 27 100 5.436697078 
2588 27 100 5.398721492 
2589 27 100 4.990794986 
2590 27 100 5.573305744 
2551 0 3 1.838550166 
2552 0 3 1.847992942 
2553 0 3 1.349892703 
2554 0 3 1.725937126 
2555 0 3 1.534652719 
2561 0 10 2.931535704 
2562 0 10 2.947599556 
2563 0 10 3.092658629 
2564 0 10 2.837625632 
2565 0 10 2.970227467 
2571 0 30 4.00746885 
2572 0 30 3.921844968 
2573 0 30 3.575724773 
2574 0 30 4.17137839 
2575 0 30 4.25251528 
2581 0 100 4.785295667 
2582 0 100 5.610955803 
2583 0 100 5.497109771 
2584 0 100 5.262724458 
2585 0 100 5.430003698 
2551 27 3 1.9326519 
2552 27 3 2.313193186 
2553 27 3 1.815261865 
2554 27 3 1.345218914 
2555 27 3 1.339432001 
2561 27 10 3.305894401 
2562 27 10 3.192621055 
2563 27 10 3.76947789 
2564 27 10 3.127887366 
2565 27 10 3.231750087 
2571 27 30 4.306556353 
2572 27 30 4.232038905 
2573 27 30 4.042378186 
2574 27 30 4.784843929 
2575 27 30 4.723665015 
2581 27 100 5.601181262 
2582 27 100 5.828647795 
2583 27 100 5.652171222 
2584 27 100 5.326512658 
2585 27 100 6.009774247 

브라우저에서 나타나는 오류는 다음과 같습니다.

"input $ estimate"은 제공된 데이터 프레임의 변수가 아닙니다.

그래서 ezANOVA() 함수는 실제 변수 이름을 사용하지 않고 "input $ estimate"문자열을 사용합니다.

이 문제를 해결하는 방법이나 도움이되지 않습니까? 미리 도움 주셔서 감사합니다!

답변

1

ezANOVA()에 대한 호출을 동적으로 구성해야합니다. 즉, input 변수의 문자열 값을 사용하여 함수 호출을 정의해야합니다. 그것의 LISP 유산 때문에, 이것은 eval 경유로 R에서 비교적 쉽습니다. (상대적으로 문자열이 여전히 R에서 고통스럽고이 작업을 수행하기 위해 문자열을 조작해야하기 때문에). 여기에 코드의 최소한의 작업 버전이 있습니다.

server.R

library(shiny) 
library(ez) 

shinyServer(function(input, output) { 

    csvfile <- reactive({ 
     csvfile <- input$file1 
     if (is.null(csvfile)){return(NULL)} 
     dt <- read.csv(csvfile$datapath, header=input$header, sep=input$sep) 
     dt 
    }) 

    output$var <- renderUI({ 
     if(!is.null(input$file1$datapath)){ 
      d <- csvfile() 
      anova.opts <- list(
          radioButtons("estimate", "Please Pick The Dependent Variable", choices = names(d)), 
          radioButtons("between1", "Please Pick The Between Subjects Factor", choices = names(d)), 
          radioButtons("within1", "Please Pick The Within Subjects Factor", choices = names(d)), 
          radioButtons("sid", "Please Pick The Subject Id Variable", choices = names(d)), 
          actionButton("submit", "Submit") 
         ) 
      anova.opts 
     } 

    }) 


    output$aovSummary = renderTable({ 

     if(!is.null(input$submit)){ 

      aov.out <- eval(parse(text=paste(
           "ezANOVA(data = csvfile() 
           , dv = .(", input$estimate, ") 
           , wid = .(", input$sid, ") 
           , between = .(", input$between1, ") 
           , within = .(", input$within1, ") 
           , detailed = TRUE, type = \"III\")"))) 
     aov.out$ANOVA 
     } 
    }) 
}) 
library(shiny) 

shinyUI(pageWithSidebar(

    headerPanel('Analysis of Variance'), 

    sidebarPanel(

     fileInput("file1", "CSV File", accept=c("text/csv", "text/comma-separated-values,text/plain", ".csv")), 

     checkboxInput("header", "Header", TRUE), 

     radioButtons('sep', 'Separator',c(Comma=',',Semicolon=';',Tab='\t', `White Space`=''),''), 

     uiOutput('var') 
    ), 

    mainPanel( 

     tableOutput('aovSummary') 

    ) 
) 
) 

내가 작은 문제의 번호가 고정/변경했지만, eval() 관련이없는 두 개의 가장 큰 변화가 있었다

ui.R

:

  1. 필드 분리 기호로 공백 문자를 사용하여 R에 일반적인 작업을 수행하는 옵션을 포함합니다.
  2. render 함수가 실제 ANOVA 테이블을 포함하도록 변경되었습니다. ezANOVA은 목록을 반환하며 그 중 첫 번째 항목은 항상 ANOVA이고 ANOVA 테이블을 포함합니다. 그러나 가정 테스트 및 사후 정정을위한 추가 항목이 있습니다. 구형과 Huynh-Feldt 보정에 대한 Mauchly의 테스트. 실제로 이들을 처리 할 논리를 추가해야합니다.

코드 스타일도 문제입니다 - 당신이 실제로 실행 코드가 조건에 대한 전체 else와 대신 시험 다음에 빈 if 블록을 없애하는 것이 좋습니다. 함수의 끝이 존재하지 않는 반환 값을 시뮬레이트합니다.내가 UI 개선 있으리라 믿고있어

는 작업 예제를 기다리고 있었다,하지만 당신은 고려해야합니다 및/또는 라디오 버튼에 반응하지 않는 다른 인수 아마도 변수 유형에

  1. 의미있는 기본값을, 대신 액션 버튼에 반응합니다. 그렇지 않으면 값을 설정하는 동안 ezANOVA에서 혼란스러운 오류가 발생합니다.
  2. 디자인 중간이나 순수한 경우 어떻게됩니까?

초기 옵션 (데이터 파일)이 의미있는 방식으로 설정 될 때까지 추가 옵션을 숨기려면 conditionalPanel()을 살펴볼 수도 있습니다.

+0

굉장! 도와 줘서 고마워! 당신 말이 맞아요, 혼동하지 않도록 코드를 최소한으로 유지하고있었습니다. 필자가 연주하는 데이터는 ANOVA가 혼합 된 프로 시저를 사용하기 때문에 지금 막 붙어 있지만 지금은 많은 다른 디자인에이 코드를 사용할 계획입니다. 나에게 eval() 메소드를 명확히 해줘서 고마워. 다른 권장 변경 사항도 반드시 작성해야합니다. :) – sugarfacex101

+0

당신이 답을 얻는다면 질문이 하나 더 생깁니다. 어떻게 csvfile() [, input $ between1]의 벡터를 고려해야할까요? 그렇지 않으면 ANOVA 테스트가 작동하지 않습니다. – sugarfacex101

+0

'eval (parse (text = paste0 ("d $", 입력 $ between1, "<- 인수 (d $", 입력 $ between1, ")"))' – Livius