2017-04-18 5 views
0

저는 이틀 동안이 문제에 갇혀 있었고, 저보다 훨씬 똑똑한 사람들의 도움을 받고 싶습니다. "shinyTable"(https://github.com/trestletech/shinyTable)이라는 패키지를 사용하고 있으며, 그것을 조작하는 데 어려움을 겪고 있습니다. ? 이제렌더링 기능을 사용하여 eventReactive 사용

library(shinythemes) 
library(shiny) 
library(shinyTable) 

ui <- fluidPage(theme = shinytheme("slate"),titlePanel(HTML("<h1> <font face=\"Rockwell Extra Bold\" color=\"#b42000\"><b><b>R/Econ</b></b></font> <font face=\"Lucida Calligraphy\" colsor=\"white\" >Model</font></h1>")), 
       sidebarLayout(
        sidebarPanel( 
        numericInput("rows", label = h3("Number of Rows"), value = 20), 
        numericInput("cols", label = h3("Number of Columns"), value = 2) 
       ), 
        mainPanel(
        htable("tbl") 
       ) 
       ) 
) 
server <- function(input, output) 
{ 
    output$tbl <- renderHtable({ 
    if (is.null(input$tbl)){ 
     # Seed the element with some data initially 
     tbl <- data.frame(list(num1=1:input$rows, 
          num2=(1:input$rows)*20, 
          letter=LETTERS[1:(input$rows)])) 
     cachedTbl <<- tbl 
     print(tbl) 
     return(tbl) 
    } else{ 
     cachedTbl <<- input$tbl 
     print(input$tbl) 
     return(input$tbl) 
    } 
    }) 

} 
shinyApp(ui = ui, server = server) 

나는 : 기본적으로,이 표는 입력 $ 행 기반으로 크기를 변경 내가 할 수있는 방법 나는 "제출"버튼을 클릭하면 여기에 버튼을 "제출"오 승/작업 코드는 입력 $ 행이나 입력 $ cols가 변경되면 테이블의 크기가 동적으로 변경되기를 원합니다. 나는이 일을하는 방법을 알아낼 수 없다. 나는 다음을 시도했다 :

myx<-eventReactive (input$submit, { 
    output$tbl <- renderHtable({ 
    if (is.null(input$tbl)){ 
     tbl <- data.frame(list(num1=1:input$rows, 
          num2=(1:input$rows)*20, 
          letter=LETTERS[1:(input$rows)])) 
     cachedTbl <<- tbl 
     print(tbl) 
     return(tbl) 
    } else{ 
     cachedTbl <<- input$tbl 
     print(input$tbl) 
     return(input$tbl) 
    } 
    }) 
    }) 

그러나 이것은 작동하지 않는다. 내 생각 과정은 제출 버튼을 클릭하면 테이블을 다시 작성한다는 것입니다. 입력 $ 행을 사용하여 테이블의 크기를 변경하고 싶지만 크기를 변경하거나 제출 버튼을 클릭해도 아무런 변화가 없습니다. 실제로 eventReactive를 추가하면 테이블에 값이없는 곳에 테이블이 변경되고 값을 입력 할 수 없습니다. 나는 솔직히 잃어 버렸다. 나는 이것과 같은 다른 변형을 시도했다 :

myx<-eventReactive (input$submit, { 
    if (is.null(input$tbl)){ 
     tbl <- data.frame(list(num1=1:input$rows, 
          num2=(1:input$rows)*20, 
          letter=LETTERS[1:(input$rows)])) 
     cachedTbl <<- tbl 
     print(tbl) 
     return(tbl) 
    } else{ 
     cachedTbl <<- input$tbl 
     print(input$tbl) 

    } 
    }) 
    #------- 
# myx2<-eventReactive (cachedTbl, { 
# }) 
    output$tbl <- renderHtable({ 
     tbl<<-myx() 
     print(data.frame(tbl))#Tried and failed using myx() 
     return(data.frame(tbl)) 

    }) 

이 일을하면서 나는 테이블을 반응 적으로 만든 다음 그것을 renderHTable에 전달할 수 있다고 생각했다. 이러한 모든 시도는 내가 사물을 반응 적으로 만들려고한다는 사실을 공유합니다.

"제출"버튼을 클릭하면이 테이블의 크기를 입력 $ 행에 따라 변경할 수 있습니까? 도와주세요!

+0

shandsTable을 발전시킨 rhandsontable https://github.com/jrowen/rhandsontable을 사용해야합니다. 횡포가 크란에 있고 유지됩니다. shinyTable이 아닙니다. – Enzo

+0

'eventReactive()'대신'observeEvent()'를 사용 해보고'input $ rows' 코드가'$ row'를 의미하므로'input $ rows'를 정의한 곳을 찾을 수 없습니다. – Phi

답변

0

시작해야합니다. 내 의견에 따라 rhandsontable을 사용해야합니다. 이 패키지는 동일한 기본 JS 라이브러리 인 handsontable.JS을 사용하지만 잘 지원되며 Cran (면책 조항 :이 패키지에 대한 기여도가 가장 낮음)에 있습니다.

아래의 작업 예제는 rhandsontable을 기반으로합니다. 간단히하기 위해 행 수의 변경 만 구현했습니다.

글로벌 변수 또는 반응 변수에 대한 모든 유형의 캐싱 메커니즘을 구현하지 않았지만 필요하지 않았기 때문에이를 고려해보십시오. 그러나 쉽게 추가 할 수 있습니다.

shiny에서 작동하는 라이브러리를 알고있는 유일한 예는 input$something에 연결된 output$something입니다. 이 경우 코드의 input$tbl에서

테이블을 참조하지만 편의 기능 hot_to_r ( Rhandsontable)로 변환 될 필요가있는 데이터 프레임으로 변환한다.

나는 이미 익숙하다고 확신합니다 : hot_to_r(input$tbl)을 사용하여 사용자가 표시된 표의 내용을 변경했는지 확인합니다 (읽기 전용이 아닌 것으로 가정). shinyTable은 훨씬 복잡한 메커니즘을 가지고 있지만 인종에 취약합니다.

library(shinythemes) 
library(shiny) 
library(rhandsontable) 

ui <- fluidPage(theme = shinytheme("slate"),titlePanel(HTML("<h1> <font face=\"Rockwell Extra Bold\" color=\"#b42000\"><b><b>R/Econ</b></b></font> <font face=\"Lucida Calligraphy\" colsor=\"white\" >Model</font></h1>")), 
       sidebarLayout(
        sidebarPanel( 
        numericInput("rows", label = h3("Number of Rows"), value = 20), 
        numericInput("cols", label = h3("Number of Columns"), value = 2) 
       ), 
        mainPanel(
        rHandsontableOutput("tbl") 
       ) 
       ) 
) 

server <- function(input, output, session) { 

    data = reactive({ 
    if (is.null(input$tbl)) { 
     DF <- data.frame(num1 = 1:input$rows, bool = TRUE, nm = LETTERS[1:input$rows], 
         dt = seq(from = Sys.Date(), by = "days", length.out = input$rows), 
         stringsAsFactors = F) 

    } else if(nrow(hot_to_r(input$tbl)) == input$rows) { 
     DF <- hot_to_r(input$tbl) 
     } else { 
     DF <- data.frame(num1 = 1:input$rows, bool = TRUE, nm = LETTERS[1:input$rows], 
       dt = seq(from = Sys.Date(), by = "days", length.out = input$rows), 
       stringsAsFactors = F) 
    } 
    DF 
    }) 

    output$tbl <- renderRHandsontable({ 
if (is.null(input$rows) | is.null(input$cols)) return() 
    df = data() 
    if (!is.null(df)) 
     rhandsontable(df, stretchH = "all") 
    }) 

} 

shinyApp(ui = ui, server = server) 

본인에게 알려 주시면 알려주세요. 필요에 따라 변경해 드리겠습니다.

+0

안녕하세요. 도움. :) – magicmykh

+0

헤이 엔조, 네가 슈퍼 바쁘다는 것을 알기 때문에 나는이 주석을 보면서 정말로 고맙게 생각한다. DF에 저장된 새 데이터 프레임을 이전 DF와 어떻게 비교합니까? 즉, 사용자가 새로운 것을 입력하기 전에 새 사용자 입력과 테이블을 비교하려고합니다. – magicmykh

+0

전략은 이전 (변경되지 않은) 값, 예를 들어'dfOld'를 새로운 값, 예를 들어'dfNew'와 비교하는 것입니다. 다른 전략이 있습니다. 하나는'which (dfOld! = dfNew, arr.ind = TRUE)'를 사용하는 것인데, 변경된 행과 열을 제공합니다. 이 코드를 코드에 추가 할 수 있는지 알아 보도록하겠습니다 만, 하루 정도 지나면 미안합니다. – Enzo

관련 문제