首页 文章

函数observe()和reactiveValues()如何工作?

提问于
浏览
3

我有一个表单有两个不同的动作 . 第一个是上传文件,第二个是示例 . 当我点击其中一个我的应用程序做了什么,但服务器保存点击的信息,没有变化,直到我点击其他按钮 .

例如,如果我单击上传按钮而不选择文件,它什么都不做,但如果我选择一个文件,服务器上传文件并开始处理它而不点击上传按钮,因为服务器保存了过去的点击 . 我想知道是否可以重置每次点击的值 .

的index.html

<form class="span12 menu-med-upload">
 <div class="row-fluid">
  <h3>Upload File .fasta</h3>
  <div class="custom-input-file btn btn-inverse">
   <input type="file" size="1" name="fileFasta" id="fileFasta" class="input-file" />
   Select File
  </div>
  <img src="/static/img/check.png" class = "custom-input-check">
  <div class="span12"></div>
  <textarea class = "span12" rows  = "10" style="resize: none;" id="textAreaFasta">
  </textarea>
 </div>
 <button id="uploadFasta" type="button" class="btn btn-inverse action-button" >Upload    File</button>
 <button id="exampleFasta" type="button" class="btn btn-inverse action-button"  >Example</button>
</form>

Server.R

shinyServer(function(input, output, session) {

 # Create a reactiveValues object, to let us use settable reactive values
 values <- reactiveValues()
 # To start out, lastAction == NULL, meaning nothing clicked yet
 values$lastAction <- NULL
 # An observe block for each button, to record that the action happened
 observe({
  if (input$exampleFasta != 0) {
   values$lastAction <- 'example'
  }
 })
 observe({
  if (input$uploadFasta != 0) {
   values$lastAction <- 'upload'
  })
 })

 # Then you can use values$lastAction in reactive expressions, outputs, etc.
 output$table <- renderText({
  if (is.null(values$lastAction)) 
   return(NULL)
  if (identical(values$lastAction, 'upload'))
   return(myRenderTable(matrixProtein(), "table", nameFile))
  if (identical(values$lastAction, 'example'))
   return(myRenderTable(matrixProteinExample(), "table", ""))
  stop("Unexpected value for lastAction: ", values$lastAction)
 })
})

注意:Joe Cheng编写了server.R的代码,我复制到这个例子中工作到shiny Change data input of buttons

2 回答

  • -4

    没有可重复的例子,这个问题更难回答 . 但是,我从反应上下文中得到了答案 . 这意味着每次更改文件元素时,输出也会更改 . 第二个问题是每个按钮的代码只在连续多次单击时被调用一次,这意味着如果您未能单击示例,则不会发生上载(在修复 isolate 问题之后)按钮第一 .

    现在它的工作原理我相信OP想要的 .

    这是固定的 index.html

    <html>
      <head>
      <script src="shared/jquery.js" type="text/javascript"></script>
      <script src="shared/shiny.js" type="text/javascript"></script>
      <link rel="stylesheet" type="text/css" href="shared/shiny.css"/> 
    </head>
    <body>
    <form class="span12 menu-med-upload">
     <div class="row-fluid">
      <h3>Upload File .fasta</h3>
      <div class="custom-input-file btn btn-inverse">
       <input type="file" size="1" name="fileFasta" id="fileFasta" class="input-file" />
       Select File
      </div>
     </div>
     <button id="uploadFasta" type="button" class="btn btn-inverse action-button" >Upload    File</button>
     <button id="exampleFasta" type="button" class="btn btn-inverse action-button"  >Example</button>
    </form>
      <div id="table" class="shiny-html-output"></div>
    </body>
    </html>
    

    这是固定的 server.R

    library("xtable")
    library("Biostrings")
    
    myRenderTable <- function(data, dataType, nameFile) {
      print(xtable(data), type = "html", print.results = FALSE)
    }
    
    matrixProtein <- function(fastaFile) {
      fasta <- readDNAStringSet(fastaFile)
      alphabetFrequency(translate(fasta))
    }
    
    matrixProteinExample <- function() {
      matrixProtein(system.file("extdata", "someORF.fa", package="Biostrings"))
    }
    
    shinyServer(function(input, output, session) {
    
      # Create a reactiveValues object, to let us use settable reactive values
      values <- reactiveValues()
      # To start out, lastAction == NULL, meaning nothing clicked yet
      values$lastAction <- NULL
      # An observe block for each button, to record that the action happened
      # Note setting the lastAction to NULL and then to a string ensures the output
      # is generated each time the button is clicked which is necessary for the upload button
      observeEvent(input$exampleFasta, {
        values$lastAction <- "example"
      })
      observeEvent(input$uploadFasta, {
        values$lastAction <- NULL
        values$lastAction <- "upload"
      })
    
      nameFile <- "Random"
    
      # Then you can use values$lastAction in reactive expressions, outputs, etc.
      output$table <- renderText({
        if (is.null(values$lastAction)) 
          return(NULL)
        if (identical(values$lastAction, 'upload')) {
            if (!is.null(isolate(input$fileFasta))) {
              return(myRenderTable(isolate(matrixProtein(input$fileFasta$datapath)), "table", nameFile))
            } else {
              stop("No file provided")
            }
        } else if (identical(values$lastAction, 'example'))
          return(myRenderTable(matrixProteinExample(), "table", ""))
        stop("Unexpected value for lastAction: ", values$lastAction)
      })
    })
    

    请注意,这取决于Bioconductor包 Biostrings 和CRAN包 xtable . 我不知道原始函数是做什么的,但是这段代码采用FASTA格式的文件,读取序列,翻译成蛋白质序列,然后给出一个字母表频率表 .

    还要注意我不知道 myRenderTable 的其他参数是什么意思,所以我忽略了它们 .

  • 4

    你想要孤立 . 所以在R控制台中键入它

    ?shiny::isolate
    

相关问题