R/Rstudio:是否有监视功能来持续监视某些值?

R/Rstudio:是否有监视功能来持续监视某些值?,r,rstudio,R,Rstudio,我在一个相当大的数据帧上运行了很多不同的操作。这对维护来说开始是一件痛苦的事情,特别是一些数据格式不正确,我正在寻找一些选项来简化我的生活 问题在于,在操作流程中的某一点上,NAs被引入了几行,包括id(当然是由于某些错误的子集)。现在我无法轻易找到罪魁祸首,因为我每次都可以在Rstudio中查看它。。。这需要时间,我已经做了一次,但没有发现坏的操作 所以我很好奇,是否有什么软件包可以解决这个问题,或者有什么方法可以编写“类似守护进程”的程序,在出现特定值时弹出警告消息 while循环没有帮助,

我在一个相当大的数据帧上运行了很多不同的操作。这对维护来说开始是一件痛苦的事情,特别是一些数据格式不正确,我正在寻找一些选项来简化我的生活

问题在于,在操作流程中的某一点上,NAs被引入了几行,包括id(当然是由于某些错误的子集)。现在我无法轻易找到罪魁祸首,因为我每次都可以在Rstudio中查看它。。。这需要时间,我已经做了一次,但没有发现坏的操作

所以我很好奇,是否有什么软件包可以解决这个问题,或者有什么方法可以编写“类似守护进程”的程序,在出现特定值时弹出警告消息

while循环没有帮助,因为它计算所有语句,当然,在某一点上,条件不是真的,当它停止时,它不会打印

while(nrow(df[is.na(df$id),]) > 0){
statements OK
breaking statement
other OK statements
}
我会寻找其他的选择,但我想问之前


编辑:谢谢你的有用评论,我肯定会更多地研究这些功能。不过,我也尝试为自己构建一个手表功能(请参见我的答案)。

好吧,我想我终于构建了类似的功能:

这是一个函数,用于在满足给定条件之前为每行源文件行:

watchIt <- function(file,watchexpression,startwatchline){
  line <- 1
  sourceList <- scan(file = "source_test.R", what="character", sep="\n", blank.lines.skip = FALSE)
  maxLines <- length(sourceList)
  while(startwatchline > line && maxLines >= line){
    cat("l")
    eval(parse(text=sourceList[line]))
    line <- line+1
    cat(line)
    cat(" ")
  }
  while(eval(parse(text=watchexpression)) == FALSE && maxLines >= line){
    cat(" L")
    eval(parse(text=sourceList[line]))
    line <- line+1
    cat(line)
    cat(" ")
  }
  if(maxLines <= line) {
    cat("End of file reached without condition getting TRUE")
  }
  else{
  cat("Condition evaluated to TRUE on line :")
  cat(line)
  cat("\n")
  cat(sourceList[line])
  }
}
这将“source_test.R”放在一个列表中,每一行都有一个新的列表项,从第10行开始,我在id字段中测试结果数据帧是否为NAs。当条件求值为TRUE或到达列表项的末尾时,执行停止


我仍然在等待其他/更好的答案。。。此外,这是我在R中创建的第四个函数,因此我想可能需要对其进行改进…

好的,我想我最终构建了类似的功能:

这是一个函数,用于在满足给定条件之前为每行源文件行:

watchIt <- function(file,watchexpression,startwatchline){
  line <- 1
  sourceList <- scan(file = "source_test.R", what="character", sep="\n", blank.lines.skip = FALSE)
  maxLines <- length(sourceList)
  while(startwatchline > line && maxLines >= line){
    cat("l")
    eval(parse(text=sourceList[line]))
    line <- line+1
    cat(line)
    cat(" ")
  }
  while(eval(parse(text=watchexpression)) == FALSE && maxLines >= line){
    cat(" L")
    eval(parse(text=sourceList[line]))
    line <- line+1
    cat(line)
    cat(" ")
  }
  if(maxLines <= line) {
    cat("End of file reached without condition getting TRUE")
  }
  else{
  cat("Condition evaluated to TRUE on line :")
  cat(line)
  cat("\n")
  cat(sourceList[line])
  }
}
这将“source_test.R”放在一个列表中,每一行都有一个新的列表项,从第10行开始,我在id字段中测试结果数据帧是否为NAs。当条件求值为TRUE或到达列表项的末尾时,执行停止


我仍然在等待其他/更好的答案。。。此外,这是我在R中创建的第四个函数,因此我想可能需要对其进行改进…

基本上您正在调试。尝试在例程中包含一些将在屏幕上输出进度/状态的
print
语句。否则,这可能会有帮助:您可以使用
expr
向函数添加
browser()
命令,该命令在调试所需的条件为meter时计算为TRUE。尝试在例程中包含一些将在屏幕上输出进度/状态的
print
语句。否则,这可能会有帮助:您可以向函数中添加
browser()
命令,并使用
expr
在满足条件时计算为TRUE。我认为您的函数在大多数情况下都无法工作。例如,在使用lappy()和定义特殊函数时,有多行分割的命令。您的计算是逐行计算的,它假设每一行都是自包含的。。。这种情况很少发生。当然,它并不完美,但即使在你的建议中,它也会给我一个提示,告诉我应该去哪里看,不是吗?不管怎样,多亏了它,我在脚本中找到了罪魁祸首,解决了我的问题,如果这能帮助其他人。。。Multumesc:)我认为您的函数在大多数情况下都不起作用。例如,在使用lappy()和定义特殊函数时,有多行分割的命令。您的计算是逐行计算的,它假设每一行都是自包含的。。。这种情况很少发生。当然,它并不完美,但即使在你的建议中,它也会给我一个提示,告诉我应该去哪里看,不是吗?不管怎样,多亏了它,我在脚本中找到了罪魁祸首,解决了我的问题,如果这能帮助其他人。。。Multumesc:)