有光泽 - 被动()在两个被动()之间进行选择

时间:2016-04-20 19:01:26

标签: r shiny

我正在Shiny制作一个应用程序,允许用户上传数据或上传保存文件。

如果用户上传新数据,则流程如下:

上传文件>>选择表格>>选择列>>句子标记化>>单词标记>>图形

最初,我一直在使用带有reactiveValues()的observe()语句,因此在每一步中,我都将结果存储到reactiveValues()中。这使得保存文件上传的工作方式如下:

上传保存文件>>设置句子>>设置字词>>图形

我希望能够完成类似的事情但使用reactive()语句。所以,鉴于我有uploadedFiles = reactive()uploadedSave = reactive(),如何使用以下伪代码编写反应:

rawText = reactive({
  if uploadedFiles() flushes reactivity then uploadedFiles()
  else if uploadedSave() flushes reactivity then uploadedSave()
  else NULL
})

我没有“错误”我正在尝试进行故障排除,只是试图通过使用响应来充当“最近刷新”的门来允许我的数据流从两个不同的开始地点和汇合到一个。

2 个答案:

答案 0 :(得分:1)

我将展示我是如何做到的,但我觉得这不是一个好方法。我很想知道最好的方法是什么,以及我的错误。

new_react <- reactiveValues()
new_react$FilesReact <- 0 
new_react$SaveReact <- 0

invalidate <- function(x) x <- x+1

uploadedSave <- eventReactive(new_react$SaveReact,{ 
   # Set sentences >> Set words >> Graphics
})


uploadedFiles <- eventReactive(new_react$FilesReact,{ 
  # Select Sheets >> Select Columns >> Sentence Tokenization >> Word Tokenization >> Graphics
})

## I don't know how you are going to determine whether it's a data file
# or a save file...

if (its_a_save_file) {
  new_react$SaveReact <- invalidate(new_react$SaveReact)
  uploadedSave()
}else if (its_a_data_file) {
  new_react$FilesReact <- invalidate(new_react$FilesReact)
  uploadedFiles()

所以基本上我只定义了两个反应值,当这个简单函数无效时,它将允许调用反应函数uploadedSave()uploadedFiles()

修改:对我来说,这只是强制eventReactive()observeEvent()一样工作的方式

答案 1 :(得分:0)

没有更多代码,很难具体。这是一个应用程序。根据最后使用的控件显示不同的值。使用observeEvent()监控控件,每个控件都将其input置为无效值。然后output只适用于无效值中的任何内容。对于您的情况,您需要为用于执行文件和保存上载的每个控件设置observeEvent()。然后他们将每个文件放入一个公共reactiveValue,该值用于进一步处理。

library(shiny)

app<-shinyApp(
  ui=(fluidPage(sliderInput("First", min=1, max=10, label="Slider", value=1),
                actionButton("Second", label="Second Button"),
                textOutput("OutText"))
    ),

  server=function(input,output){

    RV<-reactiveValues(data=NULL)

    observeEvent(input$First,
      RV$Text<-input$First)

    observeEvent(input$Second,
       RV$Text<-"Second")

    output$OutText<-renderText({
      req(RV$Text)
      RV$Text
    })
  }
)

runApp(app)