R Shiny:测试req()后是否存在可选的无功值

dvtswwa3  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(119)

我有这样的代码

myfx <- reactive({
  req(
    isTruthy(input$value),
    isTruthy(data1()) || isTruthy(data2())
  )
  ...
  
  if(exists(data2())) {
    # do some stuff
  }
  ## do this other stuff regardless 
})

if(exists())是我的难点所在。Exists不是这里的正确函数,validate(need(data2()))也不起作用。如果存在可选的reactive之一(来自至少需要一个的组),我如何有条件地执行一些代码?

EDIT 1:要明确问题,请参见下面调试打印所示的问题:

myfx <- reactive({
  req(
    isTruthy(input$value),
    isTruthy(data1()) || isTruthy(data2())
  )
  
  print("I am printed, and data2() has not been uploaded by user")
  print(isTruthy(data2()))
  print("I am never printed")

  if(isTruthy(data2())) {
    # do some stuff
  }
  ## do this other stuff regardless 
})

**编辑2:**好的,我知道原因了,我也知道我在第一次req()调用中没有观察到行为,因为短路(||),但现在我陷入了如何实现我想要的行为的困境,基本上我不会计算数据2()直到用户上传了一些内容(这里也使用req())。这就是这个挂在那里的地方。但是如果我把req()从这个顶部移走,然后我得到错误,因为我试图工作在不存在的输入。请参阅下面的data2()的定义。我该如何修复这个问题?

data2 <- reactive({
    req(input$data2)

    read.csv(input$data2$datapath) %>%
        as_tibble() %>%
        return()
})
qqrboqgw

qqrboqgw1#

您可以重用isTruthy,因为它对于0行仍然返回true,所以您可能需要添加一个非零行计数检查:

myfx <- reactive({
  req(
    isTruthy(input$value),
    isTruthy(data1()) || isTruthy(data2())
  )
  ...
  
  if (isTruthy(data2()) && nrow(data2()) > 0) {
    # do some stuff
  }
  ## do this other stuff regardless 
})

或者,您可以在try/tryCatch中捕获该尝试并做出相应的React:

myfx <- reactive({
  req(
    isTruthy(input$value),
    isTruthy(data1()) || isTruthy(data2())
  )
  ...

  res2 <- tryCatch({
    # do some stuff with data2()
  }, error = function(e) NULL)
  
  ## do this other stuff regardless 
})
pw9qyyiw

pw9qyyiw2#

好了,这是最终的解决方案。

myfx <- reactive({
  req(
    isTruthy(input$value),
    isTruthy(data1()) || isTruthy(data2())
  )
  
  print("I am printed, and data2() has not been uploaded by user")
  print(isTruthy(data2()))
  print("I am never printed")

  if(isTruthy(data2())) {
    # do some stuff
  }
  ## do this other stuff regardless 
})

data2 <- reactive({
    if(isTruthy(input$data2)) {
        read.csv(input$data2$datapath) %>%
          as_tibble() %>%
          return()
    }
})
wgxvkvu9

wgxvkvu93#

1.通过检查行数,如果dat2不存在,则引发错误
1.如果dat2不存在,chk将变为NULL
1.在if语句中使用chk来确定要做什么

chk <- tryCatch({ nrow(dat2()) > 0}, error = function(e) NULL)

if(is.null(chk)){
  dat1
} else{
  cbind(dat1, dat2)
}

相关问题