2017-04-07 55 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循環稍慢。對於循環來說,一般情況下並不壞,只要不做循環的每次迭代就可以增長對象。但即使沒有這樣做,速度也會變慢(請參閱我的編輯)。 –