我正在尝试从R中的循环开始,但是我很难弄清楚如何返回有关sapply函数进度的信息。例如,如果我想处理一个向量并打印出我正在处理的行,请使用我写的循环:
vec = c(1:10)
out = NULL
for (i in 1:length(vec)){
print(paste("Processing item ",i,sep=""))
y = vec[i]^2
out = c(out,y)
}
我如何用sapply做同样的事情?这是我的代码。
func = function(x) {
#print (paste("Processing item ",x,sep="")) ## This is where I want to print out the row number being processed.
x^2
}
out = sapply(vec,func)
感谢您提供任何信息。
答案 0 :(得分:3)
我建议您使用pbapply
套餐进行"添加进度条以适用' *申请'功能"
安装软件包后,运行example("pbsapply")
以查看此功能提供的示例。
答案 1 :(得分:2)
您可以改为处理索引并访问函数中的值:
vec = LETTERS[1:10]
func = function(x) {
paste("Processing item ", x, ", val:" , vec[x], sep="")
}
sapply(1:length(vec),func)
答案 2 :(得分:1)
你可以只用sprintf
- 函数:
sprintf('Processing item %s, value: %s', 1:length(vec), vec^2)
给出:
[1] "Processing item 1, value: 1"
[2] "Processing item 2, value: 4"
[3] "Processing item 3, value: 9"
[4] "Processing item 4, value: 16"
[5] "Processing item 5, value: 25"
[6] "Processing item 6, value: 36"
[7] "Processing item 7, value: 49"
[8] "Processing item 8, value: 64"
[9] "Processing item 9, value: 81"
[10] "Processing item 10, value: 100"
另一种选择是以不同的方式定义你的功能:
func <- function(x) {
p <- paste0("Processing item ", 1:length(x))
y <- x^2
cbind.data.frame(p, y)
}
现在使用func(vec)
时,它会返回一个数据帧:
p y
1 Processing item 1 1
2 Processing item 2 4
3 Processing item 3 9
4 Processing item 4 16
5 Processing item 5 25
6 Processing item 6 36
7 Processing item 7 49
8 Processing item 8 64
9 Processing item 9 81
10 Processing item 10 100