使用sapply返回行号

时间:2017-05-23 15:28:46

标签: r

我正在尝试从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)

感谢您提供任何信息。

3 个答案:

答案 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