2017-04-07 63 views
0

我在想,如果我可以使用lapply()或创建一个for()循环有我的函数如下称为decimal(see below)多次(对于我有对象的个数)第一list(),然后控制数字的数量?lapply或for循环中的R上市对象

换句话说,我怎么能避免写作:list(AA = decimal(AA, 7), BB = decimal(BB, 7))

使用lapply或创建for循环,如:lapply(AA:BB, function(x) decimal(x, 7))

这里是我的一个R函数:

decimal <- function(x, k){ 

    if(typeof(x) == "character"){ 
    return(x) 
    } 
    format(round(x, k), nsmall = k, scientific = 
     ifelse(x >= 1e+05 || x <= -1e+05 || x <= 1e-05 & x >= -1e-05, T, F)) 
    } 

    AA <- .234 
    BB <- .34789640 

    list(AA = decimal(AA, 7), BB = decimal(BB, 7)) 

    lapply(AA:BB, function(x) decimal(x, 7)) ## This doesn't work correctly 

回答

1

你几乎在那里,你需要co首先使用c(AA,BB)将mbine AABB转变成载体。然后获得从lapply我们可以只分配names()适当的名称:

vec <- c(AA, BB) 
names(vec) <- c("AA", "BB") 
res <- lapply(vec, function(x) decimal(x, 7)) 

检查对你的期望的结果我们可以看到,这有预期的行为:

identical(res, 
      list(AA = decimal(AA, 7), BB = decimal(BB, 7))) 
#[1] TRUE 

编辑:定时lapplyfor loop。 For循环稍慢(即使我们初始化到它的全长在前):

library(microbenchmark) 

###Storing for loop in a function 
for_loop <- function(invec){ 
    res_for <- rep(list(NA), length(invec)) 
    names(res_for) <- names(invec) 
    for (i in 1:length(invec)){ 
    res_for[[i]] <- unname(decimal(invec[i],7)) 

    } 
    res_for 
} 

###Microbenchmarking 
microbenchmark(for_loop(vec), 
       lapply(vec, function(x) decimal(x, 7))) 

#         expr  min  lq  mean  median  uq  max neval 
#        for_loop(vec) 276.692 282.4660 314.3094 285.6735 327.1565 759.514 100 
#  lapply(vec, function(x) decimal(x, 7)) 238.204 243.1215 264.2524 246.5430 287.5980 395.581 100 

###Just because, showing the two results are equal: 
identical(for_loop(vec),lapply(vec, function(x) decimal(x, 7))) 
#[1] TRUE 
+0

迈克,谢谢你,只是我的信息,代码明智的,就不会创建一个循环是更有效地做到这一点。 ? – rnorouzian

+0

@parvinkarimi不一定,我创建了一些代码,显示for循环稍慢。对于循环来说,一般情况下并不坏,只要不做循环的每次迭代就可以增长对象。但即使没有这样做,速度也会变慢(请参阅我的编辑)。 –