【问题标题】:R Shiny: Update a Dataframe after a user's change of inputR Shiny:用户更改输入后更新数据框
【发布时间】:2019-01-18 16:47:37
【问题描述】:

我现在尝试更改具有以下结构的现有数据框的时间太长了:

A<-c(1,NA)
B<-c(2,NA)

df<-data.frame(A,B)

>df
          A     B
1         1     2 
2         NA    NA

我想在 UI 中显示数据框,并更改一个 csv 文件,用数据框的数据覆盖它。

我想达到的路径:

  • 数据帧最初加载到 R 中。
  • 用户在应用程序的滑块上选择一个值。然后将该值写入 A2 以覆盖 NA。之后,应该将整个内容写入 CSV 文件。

到目前为止问题的孤立部分:

library("shiny")
x<- .. #(csvupload)

ui <- fluidPage(

#Copy of x
xchange<-x 

#The slider where the user chooses a value
sliderInput("slider", label = "Slider", min = 0, 
           max = 3,step=0.001, value =1),            

#Print of the changed database
textOutput("xchange"))    


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

observeEvent(input$Slider,{
    x$A[x$Szenarios=="2"]<-input$slider
 }) 

output$xchange<-renderValues({
    input$x})
}

我得到错误:

Error code:argument should be a character vector of length 1
all but the first element will be ignored
Warning: Error in reactiveValues: All arguments passed to reactiveValues() must be named.

我想我使用了 observeEvent、renderValues 或两者都错了,或者 textOutput 在这里使用是个坏主意。但是..我不知道...

我真的不需要打印它,但我认为这可能是控制我所做的事情是否正确的最佳方式。

【问题讨论】:

  • 您的数据框应该处于响应式调用中,以便在用户单击观察事件按钮时可以不断更新 - 还请提供一个 reprex 示例,以便我们查看您拥有的数据,然后我们可以为你制作一个 ui 和服务器闪亮的应用程序示例

标签: r shiny reactive


【解决方案1】:

这可能对你有用。上传和写入所有不同版本的数据时,它变得有点不稳定。

library("shiny")

ui <- fluidPage(

#The slider where the user chooses a value
sliderInput("slider", label = "Slider", min = 0, 
           max = 3,step=0.001, value =1),            

#Print of the changed database
textOutput("xchange")

)    


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

#Read data into server not ui
data<-read.csv("x")

#Re-read data for any changes, write to csv new changes, ignore startup
observeEvent(input$slider,{
data<-read.csv("x")
data$A[2]<-input$slider
write.csv(data,"data.csv")
ignoreInit=T
})

#Reactive variable xchange that updates the values of data
xchange<-reactive({
data<-read.csv("x")
data$A[2]<-input$slider
data
})

#Display the most recent file, with the most recent changes
output$xchange<-renderTable({
xchange()
})


}

【讨论】:

  • 我使用 tableOutput 而不是 textOutput (我可以提前猜到表格可能是数据框的好主意),然后您的代码似乎可以完美运行。但是我仍然有一个问题。在 xchange 的响应函数的定义中,您读取数据并将其加载到数据并再次更改数据帧的值。你能不能只在上面的 ObserveEvent 中将其更改为“x”,然后在 xchange 中读取它?是保留原始数据吗?现在您将新值加载到新的 csv 中,但稍后在 xchange 中不使用它。有什么原因吗?
  • @Michelle 我同意这是一种奇怪的方式,因为我现在正在回首往事。这样做的主要原因是因为observeEvent 不能返回任何变量,所以要将数据输出到 ui 我们需要在observeEvent 中使用render 函数(我尽量避免),或者返回数据到要输出的主要环境。至于加载数据,这是一个奇怪的位,因为我们不断地覆盖和读取数据,所以我放入了额外的读取函数以确保它是正确的版本被读取。虽然,这可以提高效率。
  • 我明白了。我实际上有一个类似的问题,我想在每次滑块输入更改并将输出加载到表中时在 observeEvent 中获取 R 代码。问题是我现在不能完全这样做(我希望^^'),因为我现在正在加载不同的数据(源代码的输出)。在我可以通过改变 input$slider 来激活响应函数之前。现在 input$slider 导致源代码运行,但它不再是输出的一部分,所以我不知道如何为我的渲染表创建一个反应函数。我尝试结合 ObserveEvent
  • 和可读的,但是它不起作用...您有什么建议吗?
  • @Michelle 您可以使用observeEvent 来监视滑块的更改,当它被触发时,您可以获取并使用您的函数,然后在observeEvent 中嵌套renderTable 函数从源函数输出您的结果。由于数据更改的唯一时间与滑块有关,这应该没问题。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2021-04-24
  • 1970-01-01
相关资源
最近更新 更多