首页 > 解决方案 > 将值更新为没有 input$ 逻辑的 input$value

问题描述

我想更改input$value我的 shinyapp 生成的值。去做这个

我尝试过:

observeEvent(input$click,
             input$vis$start[1]<- "2019-01-09T03:00:00.000Z"
            )

但我的回应是:

Warning: Error in $<-.reactivevalues: Attempted to assign value to a read-only reactivevalues object
  [No stack trace available]

所有代码:

library(timevis)
library(shiny)


data <- data.frame(
  start=c("2019-01-10","2019-01-11"),
  end =  c("2019-01-11","2019-01-12")
  )

ui <- fluidPage(
  br(),
  br(),
  timevisOutput("vis"),
  tableOutput("table"),
  actionButton("click","da")
)

server <- function(input,output){
  output$uno <- renderTimevis(

    timevis(data,options=list(editable=TRUE,stack=FALSE))
  )


  observeEvent(input$click,

               input$vis_data$start[1]<- "2019-01-09T03:00:00.000Z"

               )
  output$table <- renderTable(
    input$vis_data

  )

}

shinyApp(ui,server)

标签: rshiny

解决方案


虽然@anotherfred 对这个问题进行了讨论是正确的,但那里并没​​有完全回答。

考虑这个最小的应用程序:

library(shiny)

ui <- fluidPage()

server <- function(input, output, session) {
  print(input)
}

shinyApp(ui, server)

安慰:

...
...
$readonly
[1] TRUE

$ns
function (x) 
x
<bytecode: 0x000000000c417de0>
<environment: namespace:base>

您将在input具有read-only属性的控制台中看到。当然,理论上属性可以被覆盖。

请参阅此处的讨论: https ://github.com/rstudio/shiny/issues/167#issuecomment-108412945

这将导致:attr(input, "readonly") <- FALSE。我记得我前段时间试过这个,它奏效了。不确定它是否仍然有效,但实际上并不那么重要。因为,这肯定不是最佳实践,而且大多数时候会有更好的方法来实现所需的输出。

在您的情况下,我将使用 reactiveValue 并在renderTimevis()反应性中制作数据。如果您添加一个可重现的示例,我们可以详细讨论它。我看到了与评论中提到的 Jonny Phelps 相同的输出(加载了 timevis 库,...)


推荐阅读