2 votes

Problème lors de l'application d'une fonction à des éléments provenant de listes différentes

Je veux calculer setdiff en utilisant des éléments de deux listes.

Pour ce faire, j'ai créé une fonction qui fonctionne correctement lorsque je fournis les arguments, mais qui échoue lorsque j'essaie d'utiliser la fonction mapply .

# The lists have the following structure
list_A <- list(
  vec_A1 = list(v1="1",v2="2",v3="3"),
  vec_A2 = list(v1="3",v2="4",v3="5")
  )

list_B <- list(
  mat_B1 = matrix(as.character(1:3),nrow = 3,ncol = 1),
  mat_B2 = matrix(as.character(3:5),nrow = 3,ncol = 1)  
)

myfun <- function(vec,mat){
  vec = unlist(vec) # Create a vector from the list's elements
  mat = mat[[1]] # Extract the required matrix
  x = apply(mat,1,base::setdiff,x=vec) %>% t # Compare the vector with each matrix row
  return(x)
}

# It gives my desired output when applied over single elements from the lists
myfun(list_A[1],list_B[1])
myfun(list_A[2],list_B[2])

# But fails when using mapply
mapply(myfun,list_A,list_B, SIMPLIFY = F)

La sortie souhaitée est

     [,1] [,2]
[1,] "2"  "3" 
[2,] "1"  "3" 
[3,] "1"  "2" 

     [,1] [,2]
[1,] "4"  "5" 
[2,] "3"  "5" 
[3,] "3"  "4" 

Mais avec mapply j'obtiens

 Error in apply(mat, 1, base::setdiff, x = vec) : 
  dim(X) must have a positive length

Des indices sur ce que je manque ?

Merci d'avance.

2voto

joran Points 68079

Je pense que vous avez juste confondu [ y [[ . Essayez plutôt ceci :

myfun <- function(vec,mat){
    vec = unlist(vec) # Create a vector from the list's elements
    #mat = mat[[1]] # Extract the required matrix
    x = apply(mat,1,base::setdiff,x=vec) %>% t # Compare the vector with each matrix row
    return(x)
}

# It gives my desired output when applied over single elements from the lists
myfun(list_A[[1]],list_B[[1]])
myfun(list_A[[2]],list_B[[2]])

# But fails when using mapply
mapply(myfun,list_A,list_B, SIMPLIFY = F)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X