首先,我是新手,如果这是一个简单的问题,请原谅。按下按钮后,我将在数据集中更新输入数据。
我有两个文本输入(客户ID和客户的发生率)和两个选择器(月度第一付款和月度第二付款),我想使用闪亮的应用程序更新数据。我想按一下按钮后更新我的数据,这是问题所在。我不知道如何更新数据集中的输入。谁能帮我吗?
这是我的代码:
library(shiny)
client<-c("00001S000","00002S000","00003S000","00004S000","00005S000","00006S000","00007S000","00008S000","00009S000")
pagament_1 <- c("Gener","","Marc","Febrer","","","","Gener","")
pagament_2 <- c("Abril","","Maig","Febrer","","","","Marc","")
y<-data.frame(client,pagament_1,pagament_2)
y
ui <- fluidPage(
titlePanel("CONTROL CLIENTS"),
sidebarPanel((""),
textInput("client","Codi Client:",""),
selectInput("pagament_1","Pagament 1", choices = c("-",
"Gener",
"Febrer",
"Marc",
"Abril",
"Maig",
"Juny",
"Juliol",
"Agost",
"Setembre",
"Octubre",
"Novembre",
"Desembre")),
selectInput("pagament_2","Pagament 2", choices = c("-",
"Gener",
"Febrer",
"Marc",
"Abril",
"Maig",
"Juny",
"Juliol",
"Agost",
"Setembre",
"Octubre",
"Novembre",
"Desembre")),
textInput("incidencia","Escriu la incidencia:",""),
actionButton("goButton","Actualitzar Client!")
),
mainPanel((""),
tableOutput("client"),
dataTableOutput("df"),
textOutput("client_"),
textOutput("pag_1"),
textOutput("pag_2"),
textOutput("incidencia"),
tableOutput("client_all"))
)
server <- function(input, output) {
output$client_all <-renderTable(y)
output$client <- renderTable({
stateFilter <- subset(y,y$client == input$client)
})
output$client_ <- renderText({paste("CODI CLIENT:",input$client)})
output$pag_1 <- renderText(if(input$pagament_1 == "-"){
print("PAGAMENT 1: Sense canvis")
} else {paste("PAGAMENT 1:",input$pagament_1)})
output$pag_2 <- renderText(if(input$pagament_2 == "-"){
print("PAGAMENT 2: Sense canvis")
} else {paste("PAGAMENT 1:",input$pagament_2)})
output$incidencia <- renderText(if(input$incidencia == ""){
print("INCIDENCIA: No s'ha modificat")
} else { paste("INCIDENCIA MODIFICADA:",input$incidencia)})
df <- eventReactive(input$goButton,{
head(y,input$pagament_1)
})
data <- eventReactive(input$goButton == 1, {
if (is.null(input$client)){
return()
}
nr<- data.table(col1=input$client, col2=input$pagament_1, col3=input$pagament_2,
col4 = Sys.time(), col5 = input$incidencia)
y <<-rbind(y,nr)
})
}
shinyApp(ui = ui, server = server)
任何帮助将不胜感激
答案 0 :(得分:0)
您对如何在Shiny中传递数据有一些普遍的误解:
y <<-rbind(y,nr)
我想您想将此数据rbind
放在您在顶部创建的数据框中。但是,这种方式不起作用。您在eventReactive
语句中创建第二个数据框。将此视为自己的世界。 “全局”世界不知道反应世界内部发生了什么,这就是为什么您不能将在reactive
或eventReactive
语句中创建的data.frame传递给“外部世界”的原因。
您要做的是这样的:
data <- eventReactive(input$goButton, {
if (is.null(input$client)){
return()
}
nr<- data.table(col1=input$client, col2=input$pagament_1, col3=input$pagament_2,
col4 = Sys.time(), col5 = input$incidencia)
y <-rbind(y,nr)
y
})
您可以通过单击按钮来创建此新的data.frame或data.table,但请不要在此处使用<<-
运算符。当您单击按钮时,R会创建一个称为data
的Promise,就像R中的普通变量一样。
output$client <- renderTable({
stateFilter <- subset(data(),y$client == input$client)
})
您创建的Promise对象必须传递到反应性端点。这是渲染它的地方。您必须像编写普通函数一样通过编写data()
而不是data
来调用Promise。
这是将处理过的数据从一个地方传递到另一个地方的方式。但是,您的代码有一些错误,因此我无法直接对其进行修复(您尝试将5列的数据绑定到具有较少列的data.frame),但是您知道如何更改代码:-)