Hello,

In my previous I forgot that this, for matrices to have 2 classes , is relatively new. It was introduced in R 4.0.0. From the News file [1], point 2:


R News
[R logo] CHANGES IN 4.0.0
SIGNIFICANT USER-VISIBLE CHANGES

matrix objects now also inherit from class "array", so e.g., class(diag(1)) is c("matrix", "array"). This invalidates code incorrectly assuming that class(matrix_obj)) has length one.


So the R Core Team did an excelent job once again and warned R users. This was a major R version, where changes like this generally happen and are anounced with antecipation. (I remeber to have seen it but cannot place it.) Old code needs to be changed, it might break.


[1] https://cran.r-project.org/bin/windows/base/old/4.0.0/NEWS.R-4.0.0.html

Hope this helps,

Rui Barradas

Às 20:35 de 21/09/2022, Rui Barradas escreveu:
Hello,

Check what class(datmat) returns and use ?inherits instead.


class(datmat)
#[1] "matrix" "array"
inherits(datmat, "matrix")
#[1] TRUE


Also, the error the posted code gives is

centrality(datmat,type="flow",center=TRUE)
Error in checkDataTypes(y = NULL, networks = networks, lag = lag) :
   could not find function "checkDataTypes"


but I assume you have function checkDataTypes somewhere in your session, the problem should be solved with inherits().

Hope this helps,

Rui Barradas

Às 20:20 de 21/09/2022, Chao Liu escreveu:
Dear R-Help community,

This is a crosspost on SO but I've had no luck so far. So I have a function
which computes a centrality index for the nodes in a network or matrix.
Here is the function:

library(igraph) #load package igraph
centrality <- function (networks, type = c("indegree", "outdegree", "freeman",
     "betweenness", "flow", "closeness", "eigenvector", "information",
     "load", "bonpow"), directed = TRUE, lag = 0, rescale = FALSE,
     center = FALSE, coefname = NULL, ...) {
     if (is.null(directed) || !is.logical(directed)) {
         stop("'directed' must be TRUE or FALSE.")
     }
     else if (length(directed) != 1) {
         stop("The 'directed' argument must contain a single logical
value only.")
     }
     else if (directed == FALSE) {
         gmode <- "graph"
     }
     else {
         gmode <- "digraph"
     }
     objects <- checkDataTypes(y = NULL, networks = networks,
         lag = lag)
     centlist <- list()
     for (i in 1:objects$time.steps) {
         if (type[1] == "indegree") {
             cent <- degree(objects$networks[[i]], gmode = gmode,
                 cmode = "indegree", rescale = rescale, ...)
         }
         else if (type[1] == "outdegree") {
             cent <- degree(objects$networks[[i]], gmode = gmode,
                 cmode = "outdegree", rescale = rescale, ...)
         }
         else if (type[1] == "freeman") {
             cent <- degree(objects$networks[[i]], gmode = gmode,
                 cmode = "freeman", rescale = rescale, ...)
         }
         else if (type[1] == "betweenness") {
             cent <- betweenness(objects$networks[[i]], gmode = gmode,
                 rescale = rescale, ...)
         }
         else if (type[1] == "flow") {
             cent <- flowbet(objects$networks[[i]], gmode = gmode,
                 rescale = rescale, ...)
         }
         else if (type[1] == "closeness") {
             cent <- closeness(objects$networks[[i]], gmode = gmode,
                 rescale = rescale, ...)
         }
         else if (type[1] == "eigenvector") {
             cent <- evcent(objects$networks[[i]], gmode = gmode,
                 rescale = rescale, ...)
         }
         else if (type[1] == "information") {
             cent <- infocent(objects$networks[[i]], gmode = gmode,
                 rescale = rescale, ...)
         }
         else if (type[1] == "load") {
             cent <- loadcent(objects$networks[[i]], gmode = gmode,
                 rescale = rescale, ...)
         }
         else if (type[1] == "bonpow") {
             cent <- bonpow(objects$networks[[i]], gmode = gmode,
                 rescale = rescale, tol = 1e-20, ...)
         }
         else {
             stop("'type' argument was not recognized.")
         }
         centlist[[i]] <- cent
     }
     time <- numeric()
     y <- numeric()
     for (i in 1:objects$time.steps) {
         time <- c(time, rep(i, objects$n[[i]]))
         if (is.null(centlist[[i]])) {
             y <- c(y, rep(NA, objects$n[[i]]))
         }
         else {
             if (center == TRUE) {
                 centlist[[i]] <- centlist[[i]] - mean(centlist[[i]],
                   na.rm = TRUE)
             }
             y <- c(y, centlist[[i]])
         }
     }
     if (is.null(coefname) || !is.character(coefname) || length(coefname) >
         1) {
         coeflabel <- ""
     }
     else {
         coeflabel <- paste0(".", coefname)
     }
     if (lag == 0) {
         laglabel <- ""
     }
     else {
         laglabel <- paste0(".lag", paste(lag, collapse = "."))
     }
     label <- paste0(type[1], coeflabel, laglabel)
     dat <- data.frame(y, time = time, node = objects$nodelabels)
     dat$node <- as.character(dat$node)
     colnames(dat)[1] <- label
     attributes(dat)$lag <- lag
     return(dat)}

Here is the matrix:

dat <- read.table(text="A B #this is edgelist
1 2
1 3
1 2
2 1
2 3
3 1
3 2
3 1", header=TRUE)
datmat <- as.matrix(get.adjacency(graph.edgelist(as.matrix(dat),
directed=TRUE))) #this is the matrix
colnames(datmat) <- c("1", "2", "3") #rename the columns

When I applied the function to a matrix
centrality(datmat,type="flow",center=TRUE), it returns the error:

Error in if (class(networks) == "matrix") { :
   the condition has length > 1

What is the cause of this error? How to fix it? Any help will be greatly
appreciated!


Best,

Chao

    [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to