2013-06-18 186 views
-2

我在做交叉驗證。所以我想將數據拆分爲10倍。有人發佈了以下代碼。R交叉驗證

f_K_fold <- function(Nobs,K=10){ 
    rs <- runif(Nobs) 
    id <- seq(Nobs)[order(rs)] 
    k <- as.integer(Nobs * seq(1, K-1)/K) 
    k <- matrix(c(0, rep(k, each=2), Nobs), ncol = 2, byrow = TRUE) 
    k[,1] <- k[,1]+1 
    l <- lapply(seq.int(K), function(x, k, d) 
     list(train=d[!(seq(d) %in% seq(k[x, 1],k[x, 2]))], 
      test=d[seq(k[x,1],k[x,2])]), 
     k=k,d=id) 
    return(l) 
} 

但是我真的不明白lapply在做什麼。有人可以向新手解釋嗎?欣賞它。

+0

什麼是你不明白?簡單地說,你不明白對我們沒有什麼幫助。 –

+1

另外,我同意@Roman的一點縮進和代碼格式會真的提高可讀性。我編輯了代碼,向您展示如何格式化代碼。我還在代碼中添加了一些空格,這使得代碼更少了視覺塊,並且更具可讀性。 –

回答

3

真的很不幸,在這個例子中的代碼摺疊是可怕的,因爲適當格式化的代碼可以幫助理解代碼和捕獲錯誤。

最後三行可以看作是傳遞給lapply的匿名函數。 lapply本質上「爬」列表和每個列表元素,應用(匿名)函數。在下面的例子中,我將這些行歧義化爲一個不那麼匿名的函數,並且調用lapply

notSoanonymousFunction <- function(x, k, d) { 
    list(train = d[!(seq(d) %in% seq(k[x,1],k[x,2]))], 
     test = d[seq(k[x,1],k[x,2])]) 
    } 
    l <- lapply(seq.int(K), FUN = notSoanonymousFunction, k = k, d = id) 

如果你看一下?lapply,你會發現,沒有kd參數。但是,這些參數屬於我們的notSoanonymousFunction,並且lapply通過參數...接受它。

作爲一個心理練習,我會告訴你如何學習這個函數在做什麼。如果您需要查看功能內部發生了什麼,請將內部呼叫置於其中並運行。對你來說,這應該是這樣的:

notSoanonymousFunction <- function(x, k, d) { 
    browser() 
    list(train = d[!(seq(d) %in% seq(k[x,1],k[x,2]))], 
     test = d[seq(k[x,1],k[x,2])]) 
    } 

一旦你運行它,你的控制檯會沿着

Browser[1] > 

線的東西你現在有效的函數內。您可以通過輸入n導航到下一行,按c運行整個塊,然後按Q(請參閱?browser())一起退出瀏覽器。您可以查看和操縱adididum的對象。您可以通過使用ls()檢查工作空間來查看哪些對象位於函數內部。你可以打賭你的家庭農場,將有物品x,kd