[R] Error: unexpected '<' in "<" when modifying existing functions

Rui Esteves ruimaximo at gmail.com
Sat Jan 14 01:57:52 CET 2012


Hi.
I am trying to modify kmeans function.
It seems that is failing something obvious with the workspace.
I am a newbie and here is my code:

 myk = function (x, centers, iter.max = 10, nstart = 1, algorithm =
c("Hartigan-Wong",
+     "Lloyd", "Forgy", "MacQueen"))
+ {
+     do_one <- function(nmeth) {
+         Z <- switch(nmeth, {
+             Z <- .Fortran(R_kmns, as.double(x), as.integer(m),
+                 as.integer(ncol(x)), centers = as.double(centers),
+                 as.integer(k), c1 = integer(m), integer(m), nc = integer(k),
+                 double(k), double(k), integer(k), double(m),
+                 integer(k), integer(k), as.integer(iter.max),
+                 wss = double(k), ifault = 0L)
+             switch(Z$ifault, stop("empty cluster: try a better set
of initial centers",
+                 call. = FALSE), warning(gettextf("did not converge
in %d iterations",
+                 iter.max), call. = FALSE, domain = NA), stop("number
of cluster centres must lie between 1 and nrow(x)",
+                 call. = FALSE))
+             Z
+         }, {
+             Z <- .C(R_kmeans_Lloyd, as.double(x), as.integer(m),
+                 as.integer(ncol(x)), centers = as.double(centers),
+                 as.integer(k), c1 = integer(m), iter = as.integer(iter.max),
+                 nc = integer(k), wss = double(k))
+             myIter=Z$iter
+             if (Z$iter > iter.max) warning("did not converge in ",
+                 iter.max, " iterations", call. = FALSE)
+             if (any(Z$nc == 0)) warning("empty cluster: try a better
set of initial centers",
+                 call. = FALSE)
+             Z
+
+         }, {
+             Z <- .C(R_kmeans_MacQueen, as.double(x), as.integer(m),
+                 as.integer(ncol(x)), centers = as.double(centers),
+                 as.integer(k), c1 = integer(m), iter = as.integer(iter.max),
+                 nc = integer(k), wss = double(k))
+             if (Z$iter > iter.max) warning("did not converge in ",
+                 iter.max, " iterations", call. = FALSE)
+             if (any(Z$nc == 0)) warning("empty cluster: try a better
set of initial centers",
+                 call. = FALSE)
+             Z
+         })
+         Z
+     }
+     x <- as.matrix(x)
+     m <- nrow(x)
+     if (missing(centers))
+         stop("'centers' must be a number or a matrix")
+     nmeth <- switch(match.arg(algorithm), `Hartigan-Wong` = 1,
+         Lloyd = 2, Forgy = 2, MacQueen = 3)
+     if (length(centers) == 1L) {
+         if (centers == 1)
+             nmeth <- 3
+         k <- centers
+         if (nstart == 1)
+             centers <- x[sample.int(m, k), , drop = FALSE]
+         if (nstart >= 2 || any(duplicated(centers))) {
+             cn <- unique(x)
+             mm <- nrow(cn)
+             if (mm < k)
+                 stop("more cluster centers than distinct data points.")
+             centers <- cn[sample.int(mm, k), , drop = FALSE]
+         }
+     }
+     else {
+         centers <- as.matrix(centers)
+         if (any(duplicated(centers)))
+             stop("initial centers are not distinct")
+         cn <- NULL
+         k <- nrow(centers)
+         if (m < k)
+             stop("more cluster centers than data points")
+     }
+     if (iter.max < 1)
+         stop("'iter.max' must be positive")
+     if (ncol(x) != ncol(centers))
+         stop("must have same number of columns in 'x' and 'centers'")
+     Z <- do_one(nmeth)
+     best <- sum(Z$wss)
+     if (nstart >= 2 && !is.null(cn))
+         for (i in 2:nstart) {
+             centers <- cn[sample.int(mm, k), , drop = FALSE]
+             ZZ <- do_one(nmeth)
+             if ((z <- sum(ZZ$wss)) < best) {
+                 Z <- ZZ
+                 best <- z
+             }
+         }
+     centers <- matrix(Z$centers, k)
+     dimnames(centers) <- list(1L:k, dimnames(x)[[2L]])
+     cluster <- Z$c1
+     if (!is.null(rn <- rownames(x)))
+         names(cluster) <- rn
+     totss <- sum(scale(x, scale = FALSE)^2)
+      print(Z$iter)
+     structure(list(cluster = cluster, centers = centers, totss = totss,
+         withinss = Z$wss, tot.withinss = best, betweenss = totss -
+             best, size = Z$nc, iter = Z$iter), class = "kmeans")
+ }
> <environment: namespace:stats>
Error: unexpected '<' in "<"



More information about the R-help mailing list