2014-04-24 24 views
0

我遇到過類似的問題,比如效率低下而不是失敗,它使用lapply解決herelapply在使用自定義函數時返回NULL

(編輯) 這次我將包含垃圾數據的工作代碼,在運行時會拋出錯誤。下面的代碼按原樣運行,但是我想用最後的#'d lapply函數替換if(numruns == ...)語句。 使用func_ign_time的lapply分配NULL值。 我也遇到了f​​unc_drop_time的一些錯誤,但它們可能是相關的。

numruns = 3 
pyro_1 <- as.numeric(c(100,70,50,2,3,4,60,160,260,360,503)) 
pyro_2 <- as.numeric(c(100,100,100,70,50,2,3,4,60,160,260,360,503)) 
pyro_3 <- as.numeric(c(100,100,70,50,2,3,4,60,160,260,360,503)) 
time_diff <- seq(1,100,1) 

func_ign_time <- function(data, delay = 5, threshold = 5, time="time_diff"){ 
     diff_data <- diff(data[1:length(data)]) 
     flag <- 0 
     for (i in 1:length(diff_data)){ 
       if (diff_data[i] > threshold && diff_data[i+1] > threshold && i > delay){ 
         flag <- 1 
         time <- as.numeric(time_diff[i]) 
         #print(paste0("Plug ignition time: ", time, " seconds")) 
         return (time) 
       } 
     } 
} 
func_drop_time <- function(data, threshold = -5, time="time_diff"){ 
     diff_data <- diff(data[1:length(data)]) 
     flag <- 0 
     for (i in 1:length(diff_data)){ 
       if (diff_data[i] < threshold && flag == 0){ 
         flag <- 1 
         time <- as.numeric(time_diff[i]) 
         #print(paste0("Plug drop time: ", time, " seconds")) 
         return(time) 
       } 
     } 
} 

if (numruns == 3){ 
     time_ign_3 <- as.numeric(func_ign_time(pyro_3)-func_drop_time(pyro_3)) 
     time_ign_2 <- as.numeric(func_ign_time(pyro_2)-func_drop_time(pyro_2)) 
     time_ign_1 <- as.numeric(func_ign_time(pyro_1)-func_drop_time(pyro_1)) 
     print(paste(time_ign_1,time_ign_2,time_ign_3)) 
} 
if (numruns == 2){ 
     time_ign_2 <- as.numeric(func_ign_time(pyro_2)-func_drop_time(pyro_2)) 
     time_ign_1 <- as.numeric(func_ign_time(pyro_1)-func_drop_time(pyro_1)) 
     print(paste(time_ign_1,time_ign_2)) 
} 
if (numruns == 1){ 
     time_ign_1 <- as.numeric(func_ign_time(pyro_1)-func_drop_time(pyro_1)) 
     print(paste(time_ign_1)) 
} 

#ign_names <- paste0("pyro_", seq_len(numruns)) 
#xx <- lapply(ign_names, function(x) (func_ign_time(x))) 
#yy <- lapply(ign_names, function(x) (func_drop_time(x))) 
#zz <- xx-yy 
+1

這裏的背景有點不清楚;如果您可以編輯您的問題以便代碼可以自行運行,這將有所幫助。最初,我發現你使用'lapply'來調用'func_ing_time',但'func_ing_time'的'return'值嵌套在一個循環中。你只能從一個函數返回一個值;你期待'func_ing_time'函數返回多個值嗎?如果是這樣,那麼你應該通過調用'lapply'或'sapply'來替換func_ing_time中的'for'循環。同樣,如果您發佈了運行的代碼,則幫助您會更容易。 – FascinatingFingers

+0

除了上面的註釋,請指定輸入:什麼是'pyro_x',一個向量或一個數據框?查看[本指南](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)瞭解如何提出一個很好的問題。 – tonytonov

+0

謝謝,我已經更新了這個問題,希望它更容易理解。 Pyro_x是一個向量。 – user3564760

回答

2

你傳遞一個char變量func_ign_time(...),當它需要一個載體(顯然)。換句話說,你在做等價的:

func_ign_time("pyro_1") 

當你想

func_ign_time(pyro_1) 

試試這個:或者

lst <- list(pyro_1, pyro_2,pyro_3) 
lapply(ign_names, func_ign_time) 

,嘗試:

lapply(mget(ign_names), func_ign_time) 
+0

感謝您的回覆。當我使用名稱爲pyro_1-3的列表時,這實際上起作用。不幸的是,這繞着原始問題跳舞,這個問題是自動化包含例如pyro_1-3,當numruns == 3時,pyro_1-2,當numruns == 2時,等 – user3564760

+0

'lapply(mget(ign_names)[1:numruns],func_ign_time)' – jlhoward

+0

Works!對不起,我還沒有完全理解它,但我已經得到了我相信我想要的返回值。 '(x <-as.numeric(lapply(mget(ign_names)[1:numruns],func_ign_time))' 'y <-as.numeric(lapply(mget(ign_names)[1:numruns],func_drop_time) 'z <-xy)' – user3564760