R 每次单击actionButton时读取和覆盖数据
我正在尝试构建一个闪亮的应用程序,它可以读取数据帧,每次按下actionButton都会返回特定列的值,每次返回一行,直到数据帧的所有行都被读取为止。数据集的结构为3列,一列用于ID,一列用于特征,一列用于已读ID的指示符变量(0/1)。每次用户按下actionButton,应用程序都会从第1行开始读取数据集的一行,返回该行中第二个变量的值,并将第三个变量的值更改为1。对我来说,棘手的部分是,我想保存“使用过的”id,以便在重新启动应用程序后继续读取上次使用的id。我尝试在每个步骤加载和保存数据,并使用reactiveValues,但这似乎对我不起作用-可能我不知道如何正确使用它们。我在shiny是个新手,所以任何反馈都是非常受欢迎的。 我一直在使用的代码示例如下:R 每次单击actionButton时读取和覆盖数据,r,shiny,R,Shiny,我正在尝试构建一个闪亮的应用程序,它可以读取数据帧,每次按下actionButton都会返回特定列的值,每次返回一行,直到数据帧的所有行都被读取为止。数据集的结构为3列,一列用于ID,一列用于特征,一列用于已读ID的指示符变量(0/1)。每次用户按下actionButton,应用程序都会从第1行开始读取数据集的一行,返回该行中第二个变量的值,并将第三个变量的值更改为1。对我来说,棘手的部分是,我想保存“使用过的”id,以便在重新启动应用程序后继续读取上次使用的id。我尝试在每个步骤加载和保存数据
project.path <- getwd()
dat <- data.frame(id = c(1:20), gender = sample(c("male", "female"), 20, replace = TRUE), used = 0)
write.csv2(dat, file.path(project.path, "data.csv"), row.names = F)
saveData <- function(x) {
write.csv2(x, file = file.path(project.path, "data.csv"),
row.names = FALSE)
}
loadData <- function() {
dat <- read.csv2(file.path(project.path, "data.csv"))
return(dat)
}
# UI
ui <- fluidPage(
# Application title
titlePanel("Tittle"),
sidebarLayout(
sidebarPanel(
actionButton("counter", "Start")
),
mainPanel(
textOutput("result")
)
)
)
# SERVER
server <- function(input, output, session) {
last <- reactive({
d <- loadData()
last <- min(d$id[d$used == 0]) -1
})
cur <- reactive({
if(last() == 0){
cur <- input$counter
}else{
cur <- last() + input$counter
}
})
# Calculate Result
ResultText <- reactive({
d <-loadData()
if (input$counter == 0 & last() == 0){
paste0("No IDs have been used. Press button to start.")
}else{
if(input$counter > 0 & last() == 0){
d$used[cur()] <- 1
paste0("ID ", cur(), " is a ", as.character(d$gender[cur()]))
}else{
if(input$counter == 0 & last() > 0){
paste0("The last ID was ", d$id[last()], " (", as.character(d$gender[last()]), ") Press the button to continue reading the list.")
}else{
d$used[cur()] <- 1
paste0("ID ", cur(), " is a ", as.character(d$gender[cur()]))
}
}
}
})
output$result <- renderText({
ResultText()
})
observe({
d <- loadData()
if (input$counter > 0 & last() == 0){
cur <- input$counter
d$used[cur] <- 1
saveData(d)
}else{
if(input$counter > 0 & last() > 0){
d$used[cur()] <- 1
saveData(d)
}
}
})
}
# Run
shinyApp(ui = ui, server = server)
project.path为什么不使用NumericiInput并从数据中获取第n行?因为应用程序的目的是按顺序遍历整个数据集,而不仅仅是选择特定的数据rows@acts我刚刚试用了你的代码,它似乎很管用。按下按钮5次后,输出文件的used
列的前5行中有1个…当我退出并重新启动时,它在同一点再次拾取…是否还需要其他内容?或者你能进一步评论一下什么对你不起作用吗?@Ben,非常感谢你的评论。对我来说,在数据集中使用的列确实保存正确,但当应用程序停止并重新启动时,它会从数据集的开始处重新启动。@acts Hmmm…您是否在重新运行数据文件时无意中再次使用零重写数据文件?当我退出应用程序并重新运行(确保避免再次重写数据文件)时,我没有遇到这个问题。为什么不使用NumericiInput,并从数据中获取第n行?因为应用程序的目的是按顺序遍历整个数据集,而不仅仅是选择特定的rows@acts我刚刚试用了你的代码,它似乎很管用。按下按钮5次后,输出文件的used
列的前5行中有1个…当我退出并重新启动时,它在同一点再次拾取…是否还需要其他内容?或者你能进一步评论一下什么对你不起作用吗?@Ben,非常感谢你的评论。对我来说,在数据集中使用的列确实保存正确,但当应用程序停止并重新启动时,它会从数据集的开始处重新启动。@acts Hmmm…您是否在重新运行数据文件时无意中再次使用零重写数据文件?当我退出应用程序并重新运行(确保避免再次重写数据文件)时,我没有这个问题。。。