Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 每次单击actionButton时读取和覆盖数据_R_Shiny - Fatal编程技术网

R 每次单击actionButton时读取和覆盖数据

R 每次单击actionButton时读取和覆盖数据,r,shiny,R,Shiny,我正在尝试构建一个闪亮的应用程序,它可以读取数据帧,每次按下actionButton都会返回特定列的值,每次返回一行,直到数据帧的所有行都被读取为止。数据集的结构为3列,一列用于ID,一列用于特征,一列用于已读ID的指示符变量(0/1)。每次用户按下actionButton,应用程序都会从第1行开始读取数据集的一行,返回该行中第二个变量的值,并将第三个变量的值更改为1。对我来说,棘手的部分是,我想保存“使用过的”id,以便在重新启动应用程序后继续读取上次使用的id。我尝试在每个步骤加载和保存数据

我正在尝试构建一个闪亮的应用程序,它可以读取数据帧,每次按下actionButton都会返回特定列的值,每次返回一行,直到数据帧的所有行都被读取为止。数据集的结构为3列,一列用于ID,一列用于特征,一列用于已读ID的指示符变量(0/1)。每次用户按下actionButton,应用程序都会从第1行开始读取数据集的一行,返回该行中第二个变量的值,并将第三个变量的值更改为1。对我来说,棘手的部分是,我想保存“使用过的”id,以便在重新启动应用程序后继续读取上次使用的id。我尝试在每个步骤加载和保存数据,并使用reactiveValues,但这似乎对我不起作用-可能我不知道如何正确使用它们。我在shiny是个新手,所以任何反馈都是非常受欢迎的。 我一直在使用的代码示例如下:

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…您是否在重新运行数据文件时无意中再次使用零重写数据文件?当我退出应用程序并重新运行(确保避免再次重写数据文件)时,我没有这个问题。。。