rforcecom.checkbatchstatus() 的进度条

Progress bar for rforcecom.checkbatchstatus()

我要求编写文本或图形进度跟踪器,而 rforcecom 的批量更新功能最多可加载 10,000 个批次。

要设置和完成批量更新,必须创建一些对象——这是不可避免的。我 真的 不喜欢必须重新 运行 代码才能检查 rforcecom.checkBatchStatus() 的状态。这需要自动化,而进度条可以直观地显示实际进度,因为不首选检查全局环境,它将是静态 "status" 更新,直到再次 运行。

代码的设置方式如下:

require(Rforcecom)
## Login to Salesforce using your username and password token
## Once ready to update records, use the following:

job<- rforcecom.createBulkJob(session, operation = 'update',        
   object = 'custom_object__c')
info<- rforcecom.createBulkBatch(session, jobId = job$id, data = entry, 
   batchSize = 10000)
### Re-run this line if status(in global environment) is "In Progress" for     
### updated status
status<- lapply(info, FUN = function(x) { 
   rforcecom.checkBatchStatus(session, jobId = x$jobId, batchId = x$id)})
###Once complete, check details
details<- lapply(status, FUN = function(x){ 
   rforcecom.getBatchDetails(session, jobId = x$jobId, batchId = x$id)})    
close<- rforcecom.closeBulkJob(session, jobId = job$id)

要自动重新运行状态代码,请使用重复循环:

repeat {
   statements...
   if (condition) {
      break
   }
}

然后,要获得进度更新的视觉效果,请使用基础 R 中的 txtProgressBar()。对于这个特定功能,我使用两个简单的配套函数制作了自己的进度条函数。作为关于 progressValue() 的注释,rforcecom.checkBatchStatus() 输出为 1 和子列表的列表。用于检查已处理记录数的子列表名称是 "numberRecordsProcessed".

progressBar<- function(x, start = 0, finish){
   # x is your object that is performing a function over a varying time length
   # finish is your number of rows of data your function is processing
   pb <- txtProgressBar(min = start, max = finish, style = 3)
   for (i in 1:finish){
      i<- progressValue(x)
      setTxtProgressBar(pb, i)
      if (progressValue(x)/finish == 1) {
         close(pb)
      }
   }
}

finish<- function(x){
  return(as.numeric(nrow(x)))
}

progressValue<- function(x){
   x=x[[1]][["numberRecordsProcessed"]]
   return(as.numeric(x))
}

现在,把它们放在一起!只要您知道自己的条件:"Completed" 或 "Failed",就可以训练重复循环结束。重复 "status",这将更新处理的记录数,这样做将更新您的进度条。当处理的记录数等于数据中的行数时,进度条将退出,重复循环也将退出。

repeat { 
   status<- lapply(info, FUN = function(x){
      rforcecom.checkBatchStatus(session, jobId = x$jobId, batchId = x$id)})
   progressBar(status, finish = finish(entry))
   if (status[[1]][["state"]]=="Completed") {
      break
   }
   if (status[[1]][["state"]]=="Failed") {
      break
   }
}