如何在使用调用函数的调度程序时检查 Dataframe 是否存在

jq6vz3qz  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(100)

我尝试每秒运行一个调度程序,它调用一个函数。在函数中,调度程序在第一次迭代中生成一个dataframe。在下一次迭代中,我想生成一个新的dataframe,并将其与初始dataframe绑定。我没有成功,因为函数无法识别内存中的dataframe。请参阅下面的示例代码,它不绑定dataframe。
我也试着从下面的代码中实现函数f1:R: How to check whether object exists inside function?虽然这给出了相同的问题。
我想我必须检查内存中R从函数中保存对象的特定位置,尽管我没有成功。
你知道我该怎么解决吗?
谢谢大家!

library(tcltk2)

# alternative 1

run_once <- function() {

  # Create a data frame
  mydf1 <- data.frame (
    Fruit = c("apple", "pear"),
    Price = c(60, 45)
  )
  
  if (exists("mydf1_all", inherits = F) == TRUE){
    mydf1_all <- bind_rows(mydf1_all, mydf1)
    print("rows binded")
  } else {
    mydf1_all <- mydf1
    print("rows not binded")
  }

  print(Sys.time())
  
  # output run_once functie:
  mydf1_all_output <<- mydf1_all
  return(mydf1_all_output)
  }

# start scheduler:
tclTaskSchedule(1000, run_once(), id = "run_once", redo = TRUE)

# stop scheduler:
tclTaskDelete("run_once")

# alternative 2

run_once2 <- function() {
  
  # Create a data frame
  mydf1 <- data.frame (
    Fruit = c("apple", "pear"),
    Price = c(60, 45)
  )
  
  
  if (exists("mydf1_all") && is.data.frame(get("mydf1_all")) == TRUE){
    mydf1_all <- bind_rows(mydf1_all, mydf1)
    print("rows binded")
  } else {
    mydf1_all <- mydf1
    print("rows not binded")
  }
  
  print(Sys.time())
  
  # output run_once functie:
  mydf1_all_output <<- mydf1_all
  return(mydf1_all_output)
}

# start scheduler:
tclTaskSchedule(1000, run_once2(), id = "run_once2", redo = TRUE)

# stop scheduler:
tclTaskDelete("run_once2")
qyyhg6bp

qyyhg6bp1#

谢谢大家的提示和建议。我已经在下面的代码中实现了这些,现在运行良好。如果你有任何关于根本不同的逻辑的想法,我仍然会感兴趣!

library(tcltk2)
library(dplyr)

# alternative 1

run_once <- function() {

  # Create a data frame
  mydf1 <- data.frame (
    Fruit = c("apple", "pear"),
    Price = c(60, 45)
  )
  
  if (exists("mydf1_all")){
    mydf1_all <<- bind_rows(mydf1_all, mydf1)
    print("rows binded")
  } else {
    mydf1_all <<- mydf1
    print("rows not binded")
  }

  print(Sys.time())
  
  # output run_once function:
  return(mydf1_all)
  }

# start scheduler:
tclTaskSchedule(1000, run_once(), id = "run_once", redo = TRUE)

# stop scheduler:
tclTaskDelete("run_once")

# alternative 2

run_once2 <- function() {
  
  # Create a data frame
  mydf1 <- data.frame (
    Fruit = c("apple", "pear"),
    Price = c(60, 45)
  )
  
  
  if (exists("mydf1_all") && is.data.frame(get("mydf1_all"))){
    mydf1_all <<- bind_rows(mydf1_all, mydf1)
    print("rows binded")
  } else {
    mydf1_all <<- mydf1
    print("rows not binded")
  }
  
  print(Sys.time())
  
  # output run_once function:
  return(mydf1_all)
}

# start scheduler:
tclTaskSchedule(1000, run_once2(), id = "run_once2", redo = TRUE)

# stop scheduler:
tclTaskDelete("run_once2")

相关问题