2013-10-04 2 views
3

새로운 R 사용자로서, 우리가 기능을 입력 할 때 R이 무엇을하는지 궁금합니다. 예를 들어 클래스 패키지에서 knn 함수를 사용하고 있습니다. 내가해야 할 일은 knn을 입력하고 열차와 테스트 데이터 세트로 정의하는 것입니다. 그러면 내가 얻은 것은 테스트 데이터의 예상 클래스입니다. 그러나, 실제 방정식/수식을 볼 수있는 방법이 있는지 궁금합니다. 나는 몇 가지 알려진 참고 문헌을 살펴 보았지만 R이하는 일에 대해 궁금해하고 있습니다. 그러한 정보를 찾을 수 있습니까?현장에서 어떤 r이 일어나고 있는지 알아 보는 방법

도움을 주시면 대단히 감사하겠습니다 !!!

+3

이 경우에는 함수의 이름 인'knn'을 괄호 나 인수없이 터미널에 입력하기 만하면됩니다. 함수 정의가 화면에 표시됩니다. – Chase

+1

매우 유용한 기능에 대한 도움말 페이지를 보려면? getAnywhere를 입력하십시오. –

답변

3

편집기 (예 : RStudio)에서 함수 이름을 입력하고 행을 실행하기 만하면됩니다. 함수의 소스 코드, 즉

knn 

을 표시합니다. RStudio에서 함수를 클릭하고 F2 키를 누를 수도 있습니다. 함수 소스 코드가있는 새 탭이 열립니다.

또는 당신

debug(knn) 
knn(your function arguments) 

를 사용하고 디버거 기능을 단계별로 할 수있다. 당신이 사용을

undebug(knn) 
10

글쎄, 당신은 단순히 많은 경우에 거기 당신에게 소스를 제공 할 기능의 이름을 입력한다 할 수있는 첫번째 일을하는 경우. 예 :

> knn 
function (train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE) 
{ 
    train <- as.matrix(train) 
    if (is.null(dim(test))) 
     dim(test) <- c(1, length(test)) 
    test <- as.matrix(test) 
    if (any(is.na(train)) || any(is.na(test)) || any(is.na(cl))) 
     stop("no missing values are allowed") 
    p <- ncol(train) 
    ntr <- nrow(train) 
    if (length(cl) != ntr) 
     stop("'train' and 'class' have different lengths") 
    if (ntr < k) { 
     warning(gettextf("k = %d exceeds number %d of patterns", 
      k, ntr), domain = NA) 
     k <- ntr 
    } 
    if (k < 1) 
     stop(gettextf("k = %d must be at least 1", k), domain = NA) 
    nte <- nrow(test) 
    if (ncol(test) != p) 
     stop("dims of 'test' and 'train' differ") 
    clf <- as.factor(cl) 
    nc <- max(unclass(clf)) 
    Z <- .C(VR_knn, as.integer(k), as.integer(l), as.integer(ntr), 
     as.integer(nte), as.integer(p), as.double(train), as.integer(unclass(clf)), 
     as.double(test), res = integer(nte), pr = double(nte), 
     integer(nc + 1), as.integer(nc), as.integer(FALSE), as.integer(use.all)) 
    res <- factor(Z$res, levels = seq_along(levels(clf)), labels = levels(clf)) 
    if (prob) 
     attr(res, "prob") <- Z$pr 
    res 
} 
<bytecode: 0x393c650> 
<environment: namespace:class> 
> 

이 경우 VR_knn에 대한 외부 호출로 실제 작업이 수행되고 있음을 알 수 있습니다. 더 자세히 파고 싶으면 http://cran.r-project.org/web/packages/class/index.html으로 이동하여이 패키지의 소스를 다운로드하십시오. 다운로드 및 소스를 추출하면 C 코드를 보유 "SRC"라는 폴더를 찾을 것입니다, 당신은을 통해보고, 그 함수의 소스를 찾을 수 있습니다

void 
VR_knn(Sint *kin, Sint *lin, Sint *pntr, Sint *pnte, Sint *p, 
     double *train, Sint *class, double *test, Sint *res, double *pr, 
     Sint *votes, Sint *nc, Sint *cv, Sint *use_all) 
{ 
    int i, index, j, k, k1, kinit = *kin, kn, l = *lin, mm, npat, ntie, 
      ntr = *pntr, nte = *pnte, extras; 
    int pos[MAX_TIES], nclass[MAX_TIES]; 
    int j1, j2, needed, t; 
    double dist, tmp, nndist[MAX_TIES]; 

    RANDIN; 
/* 
    Use a 'fence' in the (k+1)st position to avoid special cases. 
    Simple insertion sort will suffice since k will be small. 
*/ 

    for (npat = 0; npat < nte; npat++) { 
    kn = kinit; 
    for (k = 0; k < kn; k++) 
     nndist[k] = 0.99 * DOUBLE_XMAX; 
    for (j = 0; j < ntr; j++) { 
     if ((*cv > 0) && (j == npat)) 
     continue; 
     dist = 0.0; 
     for (k = 0; k < *p; k++) { 
     tmp = test[npat + k * nte] - train[j + k * ntr]; 
     dist += tmp * tmp; 
     } 
/* Use 'fuzz' since distance computed could depend on order of coordinates */ 
     if (dist <= nndist[kinit - 1] * (1 + EPS)) 
     for (k = 0; k <= kn; k++) 
      if (dist < nndist[k]) { 
      for (k1 = kn; k1 > k; k1--) { 
       nndist[k1] = nndist[k1 - 1]; 
       pos[k1] = pos[k1 - 1]; 
      } 
      nndist[k] = dist; 
      pos[k] = j; 
/* Keep an extra distance if the largest current one ties with current kth */ 
      if (nndist[kn] <= nndist[kinit - 1]) 
       if (++kn == MAX_TIES - 1) 
       error("too many ties in knn"); 
      break; 
      } 
     nndist[kn] = 0.99 * DOUBLE_XMAX; 
    } 

    for (j = 0; j <= *nc; j++) 
     votes[j] = 0; 
    if (*use_all) { 
     for (j = 0; j < kinit; j++) 
     votes[class[pos[j]]]++; 
     extras = 0; 
     for (j = kinit; j < kn; j++) { 
     if (nndist[j] > nndist[kinit - 1] * (1 + EPS)) 
      break; 
     extras++; 
     votes[class[pos[j]]]++; 
     } 
    } else { /* break ties at random */ 
     extras = 0; 
     for (j = 0; j < kinit; j++) { 
     if (nndist[j] >= nndist[kinit - 1] * (1 - EPS)) 
      break; 
     votes[class[pos[j]]]++; 
     } 
     j1 = j; 
     if (j1 == kinit - 1) { /* no ties for largest */ 
     votes[class[pos[j1]]]++; 
     } else { 
/* Use reservoir sampling to choose amongst the tied distances */ 
     j1 = j; 
     needed = kinit - j1; 
     for (j = 0; j < needed; j++) 
      nclass[j] = class[pos[j1 + j]]; 
     t = needed; 
     for (j = j1 + needed; j < kn; j++) { 
      if (nndist[j] > nndist[kinit - 1] * (1 + EPS)) 
      break; 
      if (++t * UNIF < needed) { 
      j2 = j1 + (int) (UNIF * needed); 
      nclass[j2] = class[pos[j]]; 
      } 
     } 
     for (j = 0; j < needed; j++) 
      votes[nclass[j]]++; 
     } 
    } 

/* Use reservoir sampling to choose amongst the tied votes */ 
    ntie = 1; 
    if (l > 0) 
     mm = l - 1 + extras; 
    else 
     mm = 0; 
    index = 0; 
    for (i = 1; i <= *nc; i++) 
     if (votes[i] > mm) { 
     ntie = 1; 
     index = i; 
     mm = votes[i]; 
     } else if (votes[i] == mm && votes[i] >= l) { 
     if (++ntie * UNIF < 1.0) 
      index = i; 
     } 
    res[npat] = index; 
    pr[npat] = (double) mm/(kinit + extras); 
    } 
    RANDOUT; 
} 
+0

+1은 C 소스 코드에 대한 포인터입니다! – cryo111

0

의 헬프 데스크 기사 October 2006 R News (이후 뉴스 레터는 The R Journal으로 발전했습니다)에서는 R 함수의 소스에 액세스하는 방법을 보여줍니다. 함수의 이름을 입력하는 것부터 네임 스페이스를 찾는 것부터 찾는 것까지 다양한 기능을 사용할 수 있습니다. 컴파일 된 코드의 소스 파일.

관련 문제