2013-06-18 3 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 보면, 더 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() 참조)을 눌러 브라우저를 모두 종료하면 다음 줄로 이동할 수 있습니다. 당신은 개체 libidum을보고 조작 할 수 있습니다. 작업 공간을 ls()으로 검사하여 어떤 오브젝트가 기능 안에 있는지 확인할 수 있습니다. 가족 농장에 x, kd이있을 것이라고 내기를 걸 수 있습니다.

관련 문제