2013-06-18 2 views
-2

Я делаю проверку перекрестных ссылок. Поэтому я хотел разбить данные в 10 раз. У кого-то есть следующий код.R Cross Validation

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

Очень жаль, что код, сложенный в этом примере, ужасен, так как aving правильно отформатированный код может помочь в понимании кода и ловушек ошибок.

Последние три строки можно рассматривать как анонимную функцию, переданную 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, вы заметите, что нет k или d аргументов. Однако эти аргументы принадлежат нашему notSoanonymousFunction, а lapply принимает его через аргумент ....

Как умственное упражнение для вас, я покажу вам еще один трюк, как узнать, что делает функция. Если вам нужно увидеть, что происходит внутри функции, поместите вызов browser() внутри и запустите его. В вашем случае, это будет выглядеть так:

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()). Вы можете просматривать и манипулировать объектами ad libidum. Вы можете попробовать, проверив свое рабочее пространство с помощью ls(), чтобы узнать, какие объекты находятся внутри функции. Вы можете поставить свою семейную ферму, что будут объекты x, k и d.

Смежные вопросы