2016-02-16 6 views
0

Je suis en train de mettre à jour une variable globale (noms de matrice: "confusion.mat") dans une fonctionR variables globales locales

register.hit <-function(categ){ 
    confusion.mat[categ,categ] = confusion.mat[categ,categ] + 1 
    } 
sapply(intersection.list,register.hit) 

données:

confusion.mat <- structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(3L, 3L)) 
intersection.list <- c(1, 2) 

cependant, la confusion variable globale .mat n'est pas mis à jour (en mode débogage, j'ai remarqué que la variable locale confusion.mat dans la fonction register.hit est mise à jour correctement). Toute aide appréciée

+0

Pouvez-vous faire un exemple reproductible? Je n'arrive pas à recréer le problème dans 'R'. – Ruben

+0

Ceci est voulu. 'functions' ne devrait pas avoir d'effets secondaires. Utilisez les fonctions like 'apply' si vos fonctions retournent quelque chose. Sinon, restez avec une boucle 'for'. Bien sûr, il pourrait bien y avoir une meilleure solution vectorisée, mais vous ne décrivez pas ce que vous essayez réellement d'accomplir. – Roland

+0

Peut-être que c'est votre objectif? 'diag (confusion.mat) <- seq_len (nrow (confusion.mat))' – Roland

Répondre

0

après de longues recherches sur Google, je trouve que l'opérateur < < - assigne une variable globale dans un champ de fonction donc je change ma code en conséquence:

register.hit <-function(categ){ 
    confusion.mat[categ,categ] <<- confusion.mat[categ,categ] + 1 
    } 

et il fonctionne

+0

N'utilisez pas '<< -'. C'est pour les experts et non pour les débutants qui ne connaissent pas les dangers de cet opérateur. Au cours de votre recherche sur le Web, vous devriez avoir vu quelques avertissements contre l'utilisation de '<< -'. – Roland

+0

Je ne serais pas si prudent avec '' << - '. 'sapply' ne rend pas l'affectation globale comme base' for' car elle est utilisée comme 'res <- sapply (...'. Elle ne vise pas à mettre à jour la valeur mais à faire un calcul et à retourner un résultat – clemlaflemme

0

Voici une manière vectorisée d'obtenir le même résultat:

confusion.mat <- structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(3L, 3L)) 
confusion.mat[cbind(intersection.list, intersection.list)] <- 
    confusion.mat[cbind(intersection.list, intersection.list)] + 1 
#  [,1] [,2] [,3] 
#[1,] 1 0 0 
#[2,] 0 1 0 
#[3,] 0 0 0