如果从服务器调用actionButton的行为

时间:2017-11-14 16:20:54

标签: r shiny

使用actionButton调用NULL作为按钮ID在控制台中正常工作(它只是不创建ID):

> library(shiny)
> actionButton(NULL, "Label1")
<button type="button" class="btn btn-default action-button">Label1</button>

但是从服务器调用它会导致错误:

Browse[1]> actionButton(NULL, "label1")
Error in exists(name, envir = private$values) : invalid first argument

示例app:

ui <- function() {
  fluidPage()
  }

server <- function(input, output, session) {
  browser()
  }
runApp(list(ui = ui, server = server))

有人能解释一下这种行为吗?

2 个答案:

答案 0 :(得分:1)

HTML画布上的每个元素都必须有一个与之关联的唯一idhttp://www.w3.org/TR/html5/dom.html#the-id-attribute

  

id属性指定其元素的唯一标识符(ID)。该   value必须在元素的home子树中的所有ID中唯一   并且必须至少包含一个字符。该值不得包含   任何空格字符。

由于您尝试使用上面的标记向页面呈现内容,因此规则适用于所有shiny个应用

答案 1 :(得分:0)


我最好的猜测是它与 exists 函数连接,该函数由服务器在 actionButton 函数的 inputId 参数上调用。< / p>

见错误,请:

Listening on http://127.0.0.1:5515
Warning: Error in exists: invalid first argument
Stack trace (innermost first):
87: exists
86: self$exists
85: oldInputs$available
84: restoreInput
83: actionButton
82: renderUI [#10]
81: func
80: origRenderFunc
79: output$moreControls
 4: <Anonymous>
 3: do.call
 2: print.shiny.appobj
 1: <Promise>

如果你打电话:

> exists( NULL)
Error in exists(NULL) : invalid first argument


我使用此代码生成上述错误消息:

 if (interactive()) {

  ui <- fluidPage(
    uiOutput("moreControls")
  )

  server <- function(input, output) {
    output$moreControls <- renderUI({

        actionButton( NULL, "label1")

    })
  }
  shinyApp(ui, server)
}