我试图在R脚本中使用进度条用于命令行,但它只显示0%。请考虑以下工作示例:
testit <- function(x = sort(runif(20)), ...)
{
pb <- txtProgressBar(...)
for(i in c(0, x, 1)) {Sys.sleep(0.5); setTxtProgressBar(pb, i)}
Sys.sleep(1)
close(pb)
}
testit()
testit(runif(10))
testit(style = 3)
但是,我的代码无法正常工作,我无法识别我的错误:
dep=c("data.table", "docopt")
for (i in dep){
pb <- txtProgressBar(min = 0, max = length(dep), style = 3)
if (i %in% installed.packages()){
library(i, character.only = TRUE)
} else {
install.packages(i, repos="http://cran.rstudio.com/", dependencies = T)
library(i, character.only = TRUE)
}
setTxtProgressBar(pb, i)
}
close(pb)
答案 0 :(得分:0)
两个问题:i
是character
而不是数字;并且您每次在循环中重新分配到pb
。格雷戈尔建议保持i
一个整数(我偏好他的两个建议)可以这样实现:
dep=c("data.table", "docopt")
pb <- txtProgressBar(min = 0, max = length(dep), style = 3)
for (i in seq_along(dep)){
if (dep[i] %in% installed.packages()){
library(dep[i], character.only = TRUE)
} else {
install.packages(dep[i], repos="http://cran.rstudio.com/", dependencies = T)
library(dep[i], character.only = TRUE)
}
setTxtProgressBar(pb, i)
}
close(pb)
(未经测试,因为我没有您的数据。)
答案 1 :(得分:0)
我的评论基本上是一个答案,所以:
setTxtProgressBar
需要它的第二个参数是介于0和1之间的数字。您提供的i
首先是"data.table"
,然后是"docopt"
。
修改代码工作的最快方法是计算每次迭代的距离。加入你的循环:
fraction_done = match(i, dep) / length(dep)
setTxtProgressBar(pb, fraction_done)
在这种情况下,我们会计算分数,以便您可以使用默认的1
作为进度条长度。
我更喜欢的选项是重写您的循环,以便i
为1, 2, 3, ...
。虽然R允许你循环遍历任意值,但它可能会导致你问题中的混乱。相反,我几乎总是循环超过1,2,3 ......有时它需要更多的打字,但它清晰而一致。在这种情况下:
dep=c("data.table", "docopt")
pb <- txtProgressBar(min = 0, max = length(dep), style = 3)
for (i in seq_along(dep)){
if (!dep[i] %in% installed.packages()){
install.packages(dep[i], repos="http://cran.rstudio.com/", dependencies = T)
}
library(dep[i], character.only = TRUE)
setTxtProgressBar(pb, i)
}
close(pb)
我还简化了一点结构(如果你切换else
,if
并不是真正需要的。并且,正如评论中指出的那样,您希望在循环之前启动条形,而不是每次都循环。
答案 2 :(得分:0)
问题是i
是一个字符串,而不是你给出的第一个例子中的整数,你可能会看起来更像
dep=c("data.table", "docopt")
for (i in seq_along(dep)){
pb <- txtProgressBar(min = 0, max = length(dep), style = 3)
if (dep[i] %in% installed.packages()){
library(dep[i], character.only = TRUE)
} else {
install.packages(dep[i], repos="http://cran.rstudio.com/", dependencies = T)
library(dep[i], character.only = TRUE)
}
setTxtProgressBar(pb, i)
}
close(pb)