我正在用R Shiny构建一个应用程序,其中包含受Dean Attali模仿的Google表单启发的部分。在这里,我将表单数据存储在R本身中,稍后将在服务器端呈现该数据并将其用作输入值。在应用程序开始时,将没有预存储的值。在“新情况”面板中输入文本时,该名称将自动在“情况”面板中呈现。我们将值放在数字面板中,并借助于Dean Attali的保存功能,要求将条目以表格的形式保存在R中。同样,在加载保存的表时,可以使用它从“情境”面板中选择保存的情境。同样,当创建一个新条目时,这些值应追加到R中先前保存的表中(该表是在存储第一个条目时创建的),因此新值将继续追加到该表中。所有这些功能都可以在应用程序中使用。
但是我还想添加一个附加功能,其中当选择一个已经存在的情况并由用户更改其相应的数值时,这些值应在R中的已保存表中覆盖,以便下次使用选择这种情况,我们可以看到更改的值。这些值只能附加到名称在保存的R表中不存在的新条目上,否则必须将其覆盖。
正如您在原始保存功能(在代码中注释掉)中所看到的那样,它仅告诉您添加任何新条目。我试图修改该函数以使用特定情况下更改的值覆盖行,但没有成功。
我用来覆盖的方法是使用两个表:1.已保存的R表。 2.具有来自用户的值的单个行表。通过使用相同的方法,我能够覆盖函数外部的两个表之间的数据,但不能覆盖保存函数内部的两个表。新条目将追加,但是当旧值更改时,它不会被覆盖。有趣的是,尽管更改后的值正在控制台中显示,但在已保存的表中不会覆盖。
Globar.R脚本
fields <- c("situation","v1","v2","v3")
原始功能
# saveData <- function(data){
# data <- as.data.frame(t(data))
# if (exists("responses")){
# responses <<- rbind(responses, data)
# }
# else{
# responses <<- data
# }
# }
保存和加载功劳归功于Dean Attali。我已尝试修改该功能,以便覆盖特定情况下的所有更改值 否则,如果输入新情况,则将其rbind到R中的已保存表中。
由我修改
saveData <- function(data){
data <- as.data.frame(t(data))
if (exists("responses")){
if(!is.na(match(data$situation == responses$situation)){
responses <- data.table(responses, key = "situation")
data <- data.table(data, key = "situation")
rownames(responses) = responses$situation
rownames(data) = data$situation
responses[rownames(data),] = data
}
if(is.na(match(data$situation,responses$situation))){
responses <<- rbind(responses, data)
}
}
else{
responses <<- data
}
print(responses)
}
我尝试在闪亮的外部做类似的事情,并且奏效了(第一个条件)。我提供了需要查看的代码。在这里,我创建了两个数据帧dfa和dfb,其中特定的dfa情况被dfb中的相同情况覆盖。尽管情境名称的顺序在覆盖后会在dfa中更改,但您可以使用不同的值进行检查并起作用。
dfa <- data.frame(situation = c("Deka","Jitu","JD"), v1 =
c(100,200,400), v2 = c(400,600,800),v3 = c(50,40,30))
dfb <- data.frame(situation = c("Jitu", "JJ"), v1 = c(700,550), v2 =
c(1400,6000), v3 = c(75,55))
dfa <- data.table(dfa, key = "situation")
dfb <- data.table(dfb, key = "situation")
rownames(dfa) = dfa$situation
rownames(dfb) = dfb$situation
dfa[rownames(dfb), ] = dfb
我已包含print以查看保存功能正在做什么。每当我更改现有情况的值时,更改后的值就会在控制台中打印为
第一行中的新值已更改,旧值请参见下文。
Listening on http://127.0.0.1:6024
situation v1 v2 v3
1: Jitu 3000 200 400
2: Deka 473 1221 434
3: JMD 795 2432 3534
4: Bruno 235 657 243
5: Hago 546 5345 1233
6: Game 2536 13231 12312
7: Jitu1 243324 2432 24234
8: Jitu2 567 697 2433
已打印的旧表值
situation v1 v2 v3
1 Jitu 3565 234 424
2 Deka 473 1221 434
3 JMD 795 2432 3534
4 Bruno 235 657 243
5 Hago 546 5345 1233
6 Game 2536 13231 12312
7 Jitu1 243324 2432 24234
8 Jitu2 567 697 2433
我也想知道1:的含义,它表示什么。尝试在Google中搜索,但找不到任何答案。只有当您尝试更改旧值而不是新条目时,您会得到1 ::
#Function to load the data
loadData <- function() {
if (exists("responses")) {
responses
}
}
下面的闪亮代码只是我的应用程序的简单版本,而是我的应用程序的基础。
library(shiny)
library(data.table)
library(DT)
library(tidyverse)
ui <- fluidPage(
textInput("situation_new", "New Situation"),
uiOutput("situation_ui"),
uiOutput("V1_ui"),
uiOutput("V2_ui"),
uiOutput("V3_ui"),
DT::dataTableOutput("table"),
actionButton("submit", "Submit")
)
server <- function(session,input,output){
# Creating a Null dataframe using reactive values.
values <- reactiveValues(df = data.frame(situation = character(),v1
= double(), v2 = double(),v3 = double(),stringsAsFactors = FALSE))
# Filling up the form data
formData <- reactive({
data <- sapply(fields, function(x) input[[x]])
data
})
# Saving the filled in form
observeEvent(input$submit,{
saveData(formData())
})
# Loading the saved form
Load_Table <- reactive({
input$submit
loadData()
})
# Table to be used for the selection
table_selectinputs <- reactive({
dat0 <- Load_Table ()
if (exists("dat0")){
dat0 <- rbind(values$df,dat0)
}
else {
values$df
}
})
# Selecting situations and new situation inputs
output$situation_ui <- renderUI({
selectInput("situation", "Situation",
c(input$situation_new,as.character(table_selectinputs()$situation)))
})
output$V1_ui <- renderUI({
numericInput("v1", "Value 1", min = 0, max = 10000, value =
"", step = 1)
})
output$V2_ui <- renderUI({
numericInput("v2", "Value 2", min = 0, max = 10000, value =
"", step = 1)
})
output$V3_ui <- renderUI({
numericInput("v3", "Value 3", min = 0, max = 10000, value =
"", step = 1)
})
# Update the numeric values
observeEvent(input$situation,
updateNumericInput(session,"v1", "Value 1", min = 0, max =
10000, value =
as.numeric(as.character(table_selectinputs()$v1))
[as.character(table_selectinputs()$situation) ==
input$situation],step = 1))
observeEvent(input$situation,
updateNumericInput(session,"v2", "Value 2", min = 0, max =
10000, value =
as.numeric(as.character(table_selectinputs()$v2))
[as.character(table_selectinputs()$situation) ==
input$situation],step = 1))
observeEvent(input$situation,
updateNumericInput(session,"v3", "Value 3", min = 0, max =
10000, value =
as.numeric(as.character(table_selectinputs()$v3))
[as.character(table_selectinputs()$situation) ==
input$situation],step = 1))
# Rendering Table
output$table <- DT::renderDataTable(datatable({
table_selectinputs()
}))
shinyApp(ui,server)
我想以某种方式使用保存功能,以便在对情况进行更改时将其保存为相同的情况,但是使用新的更改值,否则任何新条目都是对存储表的新添加。
在这方面我需要帮助,因为作为非编程背景,我的语言基础仍然不足以理解这些复杂的问题。我已经尝试了太长时间,因此决定将此问题发布在这里作为最后的解决方法。因此,非常感谢任何人的帮助