nng <- function(x=NULL,dx=NULL,k=1,mutual=FALSE,p=2) { if(is.null(dx)) { if(is.null(x)) stop("one of x or dx must be given") dx <- pdist(x,p=p) } n <- nrow(dx) A <- matrix(0,nrow=n,ncol=n) for(i in 1:n){ d <- sort(dx[i,]) A[i,dx[i,]<=d[k+1]] <- 1 } diag(A) <- 0 if(mutual){ for(i in 1:n){ A[i,] <- A[i,] & A[,i] A[,i] <- A[i,] } } if(mutual) out <- graph.adjacency(A,mode="undirected") else out <- graph.adjacency(A,mode="directed") out$k <- k out$mutual <- mutual out$p <- p out$layout <- x out }