我尝试每秒运行一个调用函数的调度器。在函数内部,调度器在第一次迭代中生成一个数据帧。在下一次迭代中,我想生成一个新的数据框,并将其与初始数据框一起bind_row。我没有成功,因为函数不识别内存中的数据帧。请参阅下面的示例代码,它没有对数据帧进行bind_row。
我也试图实现函数f1从:R:如何检查函数内部是否存在对象?
我想我必须检查内存中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")
感谢大家的提示和建议。我已经在下面的代码中实现了这些,现在运行良好。如果你对一个完全不同的逻辑有任何想法,我仍然会感兴趣!
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")