2017-05-27 47 views
1

我遇到了意外的行爲。我打算做的是: - 當用戶單擊「全選」時,「彙總表」中的所有行都被選中。這工作。但是,下面的代碼不會被調用。意外的行爲選擇全部並取消選擇所有操作按鈕(R閃亮)

data <- eventReactive(input$selectAll,{ 
     print("Select All - restore data") 
     rawdata 

    }) 

- 在另一方面,當用戶單擊「取消全」,在「彙總表」中的所有行均取消選中。此工程和GETS下面的代碼調用。

# Restore data when users click 'Deselect All' 
    data <- eventReactive(input$deselectAll,{ 
     print("Deselect All - restore data") 
     rawdata 
    }) 

任何想法爲什麼?

這裏是我的全碼:

DATASET

colA <- c('A','B','C','D','E') 
colB <- c(1,2,3,4,5) 
rawdata <- as.data.frame(cbind(colA,colB)) 
View(rawdata) 

server.R

function(input, output, session) { 

    # Activate tab 'Result' when users click 'Run' 
    observeEvent(input$runButton, { 
     updateTabsetPanel(session, "allResults", 'result') 
    }) 

    # Create a dataset based on users' selected variables 
    data <- eventReactive(input$inputVars_rows_selected,{ 
     print("Select Some Vars") 
     rawdata[, c(input$inputVars_rows_selected)] 
    }) 

    # Restore data when users click 'Select All' 
    data <- eventReactive(input$selectAll,{ 
     print("Select All - restore data") 
     rawdata 
    }) 

    # Restore data when users click 'Deselect All' 
    data <- eventReactive(input$deselectAll,{ 
     print("Deselect All - restore data") 
     rawdata 
    }) 

    ### VARIABLE SELECTION #### 

    var <- reactiveValues() 

    # Select all vars 
    observeEvent(input$selectAll,{ 
     print("SelectAll ObserveEvent") 
     var$selected <- 1:nrow(rawdata) 
     print(var$selected) 
    }) 

    # Deselect all vars 
    observeEvent(input$deselectAll,{ 
     print("deselectAll ObserveEvent") 
     var$selected <- 0 
     print(var$selected) 
     print(data()) 
    }) 

    ### RESULT TAB ### 

    result <- eventReactive (input$runButton, { 
     head(data(),2) 
    }) 

    ### RENDERING FUNCTIONS ### 

    # Default SummaryTable 
    output$inputVars <- DT::renderDataTable({ 
     if (input$selectAll==0 & input$deselectAll==0) { 
      print("Default Summary Table") 
      DT::datatable(rawdata, options = list(paging = FALSE, searching = FALSE)) 
     } 
     else { 
      DT::datatable(rawdata, options = list(paging = FALSE, searching = FALSE), selection = list(target = 'row', selected = var$selected)) 
     } 
    }) 

    # Display results 
    output$result <- DT::renderDataTable({ 
     DT::datatable(result(), options = list(paging = FALSE, searching = FALSE)) 
    }) 

    output$temp <- renderPrint({ 
     print(input$selectAll) 
     print(input$deselectAll) 
    }) 
} 

ui.R

fluidPage(

    sidebarPanel(
     actionButton("runButton", strong("Run!")) 
), 

    mainPanel(
     tabsetPanel(id = "allResults", 
     tabPanel(value='inputVars',title='Variable Selection', 
        verticalLayout(
         DT::dataTableOutput('inputVars'), 
         br(), 
         fluidRow(align="bottom", 
          column(2, actionButton("selectAll" , strong("Select All"))), 
          column(3, actionButton("deselectAll", strong("Deselect All"))) 
        ) 
       ) 
       ), 
     tabPanel(value='result',title='Result', DT::dataTableOutput('result')), 
     tabPanel(value='temp',title="TEMP", verbatimTextOutput("temp")) 
    ) 
) 

) 

修訂Server.R#2: @Mike和@H ubertL,我認爲你是對的:問題是由eventReactive擁有緩存值引起的。在此更新版本中,與全選和取消全選相對應的observeEvent按預期工作。但是,現在eventVERO對應於輸入$ inputVars_rows_selected NEVER被調用。任何想法爲什麼?

function(input, output, session) { 

    # Activate tab 'Result' when users click 'Run' 
    observeEvent(input$runButton, { 
    updateTabsetPanel(session, "allResults", 'result') 
    }) 

    data <- reactiveValues() 

    # Create a dataset based on users' selected variables 
    data <- eventReactive(input$inputVars_rows_selected,{ 
     print("Select Some Vars") 
     print(input$inputVars_rows_selected) 
     rawdata[, c(input$inputVars_rows_selected)] 
    }) 


    ### VARIABLE SELECTION #### 

    var <- reactiveValues() 

    # Select all vars 
    observeEvent(input$selectAll,{ 
    print("SelectAll ObserveEvent") 
    data <- rawdata 
    var$selected <- 1:nrow(rawdata) 
    print(var$selected) 
    print(data) 

    }) 

    # Deselect all vars 
    observeEvent(input$deselectAll,{ 
    print("deselectAll ObserveEvent") 
    data <- rawdata 
    var$selected <- 0 
    print(var$selected) 
    print(data) 

    }) 

    ### RESULT TAB ### 

    result <- eventReactive (input$runButton, { 
    head(data(),2) 
    }) 

    ### RENDERING FUNCTIONS ### 

    # Default SummaryTable 
    output$inputVars <- DT::renderDataTable({ 
    if (input$selectAll==0 & input$deselectAll==0) { 
     print("Default Summary Table") 
     DT::datatable(rawdata, options = list(paging = FALSE, searching = FALSE)) 
    } 
    else { 
     DT::datatable(rawdata, options = list(paging = FALSE, searching = FALSE), selection = list(target = 'row', selected = var$selected)) 
    } 
    }) 

    # Display results 
    output$result <- DT::renderDataTable({ 
    DT::datatable(result(), options = list(paging = FALSE, searching = FALSE)) 
    }) 

    output$temp <- renderPrint({ 
    print(input$selectAll) 
    print(input$deselectAll) 
    print(input$inputVars_rows_selected) 

    }) 
} 
+0

名稱有一個對象:不能將多個反應函數分配給同一個變量名,這裏只考慮最後一個分配。考慮做一個單一的eventReactive函數,並使用if語句根據輸入返回不同的選擇 – HubertL

+0

奇怪的是,這似乎不是真的...... –

+0

實際上可能是真的,但很難判斷哪個data()被拉來自「eventReactive」緩存。 –

回答

1

的一個原因是因爲eventReactive是「惰性計算」,而不是observeEvent其立即evaulated。

所以在你的情況下observeEvent對應於deselectAll實際上使用data(),所以reactiveEvent被觸發。

# Deselect all vars 
    observeEvent(input$deselectAll,{ 
    print("deselectAll ObserveEvent") 
    var$selected <- 0 
    print(var$selected) 
    print(data()) 
    }) 

但對應selectAll不使用data(),使reactiveEvent不會被觸發observeEvent

# Select all vars 
    observeEvent(input$selectAll,{ 
    print("SelectAll ObserveEvent") 
    var$selected <- 1:nrow(rawdata) 
    print(var$selected) 
    }) 

我建議如下修改

  • 如果添加print(data())這裏你得到的一些的行爲你 正在尋找。

  • 但它仍然沒有完全正確的,因爲HubertL的評論說的data 一個定義被覆蓋也是有效的 - 和 注意,這是不容易說出它的數據被拉出。 這是因爲eventReactive具有緩存值,因此如果正在使用緩存值,您的print 可能不會顯示 - 您的代碼需要執行 以拉動該data()

  • 因此,無論如何,我肯定會建議使用不同的名稱(和更多的描述性),而不僅僅是重複「數據」以避免混淆。

  • 也有沒有必要在這裏使用eventReactive,你可能 想要一個簡單的reactiveeventReactive通常是需要的,如果你想避免 代碼中的所有其他反應變量的「反應」,並且我沒有在這裏看到需要。

  • 我還建議將rawdata放入reactiveValues之類的東西:rv <- reactiveValues(rawdata=rawdata),然後用它作爲rv$rawdata。這使得它成爲被動的,然後使用它的東西將被觸發並重新計算,如果它改變的話。

請參閱此鏈接(observeEvent vs. eventReactive)對這些命令的「懶惰」的討論。

+0

如果我在與selectAll對應的observeEvent中添加「print(data())」,那麼reactiveEvent仍然不會被觸發。我把我的更新代碼放在我原來的帖子中。謝謝! – Ketty

+0

奇怪的是,我從來沒有收到此評論的通知。現在就看到它。我會在今晚或明天早上看看它。 –

1

下面是可用的代碼。 @Mike和@HubertL是對的。原因是因爲反應遲鈍vs observeEvent不是。感謝你的幫助!

function(input, output, session) { 

    # Activate tab 'Result' when users click 'Run' 
    observeEvent(input$runButton, { 
    updateTabsetPanel(session, "allResults", 'result') 
    }) 

    data <- reactive({ 
    print("Select Some Vars") 
    print(input$inputVars_rows_selected) 
    rawdata[input$inputVars_rows_selected,] 
    }) 

    ### VARIABLE SELECTION #### 

    var <- reactiveValues() 

    # Select all vars 
    observeEvent(input$selectAll,{ 
    print("SelectAll --- ObserveEvent") 
    var$selected <- 1:nrow(rawdata) 
    print(var$selected) 
    print(input$inputVars_rows_selected) 
    }) 

    # Deselect all vars 
    observeEvent(input$deselectAll,{ 
    print("deselectAll --- ObserveEvent") 
    var$selected <- 0 
    print(var$selected) 
    }) 

    ### RESULT TAB ### 

    result <- eventReactive (input$runButton, { 
    head(data(),5) 
    }) 

    ### RENDERING FUNCTIONS ### 

    # Default SummaryTable 
    output$inputVars <- DT::renderDataTable({ 
    if (input$selectAll==0 & input$deselectAll==0) { 
     print("Default Summary Table") 
     DT::datatable(rawdata, options = list(paging = FALSE, searching = FALSE)) 
    } 
    else { 
     DT::datatable(rawdata, options = list(paging = FALSE, searching = FALSE), selection = list(target = 'row', selected = var$selected)) 
    } 
    }) 

    # Display results 
    output$result <- DT::renderDataTable({ 
    DT::datatable(result(), options = list(paging = FALSE, searching = FALSE)) 
    }) 

    output$temp <- renderPrint({ 
    print(input$selectAll) 
    print(input$deselectAll) 
    print(input$inputVars_rows_selected) 

    }) 
} 
+0

很高興你得到它的工作。瞭解它如何工作是一個挑戰。 –