Récupération de la liste imbriquée de listes de R vers JMPBonjour à tous,
Je tire des informations d'une API utilisant R et les récupère dans JMP. J'ai réussi à récupérer les données jusqu'à ce que l'API renvoie une liste imbriquée de listes.
Je pense que l'erreur ne vient pas de la part de R car je suis capable d'exécuter le même morceau de code dans R Studio sans erreur. Même en JSL, l'erreur ne se produit que lorsque j'essaie de récupérer l'objet de R vers JMP à l'aide de R Get (). Je reçois le message d'erreur ci-dessous lorsque j'essaie:
R Get(A) ;
R Get () prend en charge la récupération de listes - y a-t-il quelque chose que je fais mal?

De plus, comme j'ai des listes de listes imbriquées, je me demandais si parcourir en boucle le contenu de la liste était le moyen le plus efficace d'extraire les données?
Re: Récupérer la liste imbriquée de listes de R à JMPC'est plus complexe. Dans R, tous les arguments sont passés par valeur. Ainsi, même lors du premier appel, modifier "l" en crée une copie dans l'espace de noms de la fonction et la liste que vous essayez de modifier n'est pas modifiée. Dans les appels suivants, vous utilisez des versions plus petites de 'l' qui, là encore, ne font pas référence à votre liste actuelle. Pour corriger la liste, vous devez soit enregistrer une référence dans l'espace de noms dans lequel elle se trouve, puis utiliser l'argument loc pour déterminer la partie à convertir, ou créer une nouvelle copie de la liste et la renvoyer. Je fais ce dernier ici:
#verbose levels
# 0 nothing
# 1 Errors only
# 2 Everything
isvalid <- function(l, fix=FALSE, verbose = 2, loc = {} ) {
if(length(loc) > 10) throw("List is too deep, maybe you have raw data?")
for( i in seq_along(l) ) {
if( class(l[[i]]) == "list" ) {
#If a list, check recurse through it, fixing errors along the way if necessary
if (verbose > 1) print(paste0("Found list at: ", paste(c(loc, i), collapse = ", ")))
l[[i]] <- isvalid(l[[i]], fix=fix, verbose=verbose, loc=c(loc, i))
} else if (!(class(l[[i]]) %in% c("numeric", "character", "NULL"))) {
#If not valid data, try to cast as a list, or throw an error
if (verbose > 0) print(paste0("Invalid data (", class(l[[i]]), ") found at: ", paste(c(loc, i), collapse = ", ")))
if( fix ) {
#Cast as a list
l[[i]] <- as.list(l[[i]])
#Make sure it worked
if( class(l[[i]]) == "list" ) {
#If it is a list, recurse through it
if (verbose > 0) print(paste0("Successfully cast data as a list at: ", paste(c(loc, i), collapse = ", ")))
l[[i]] <- isvalid(l[[i]], fix=fix, verbose=verbose, loc=c(loc, i))
} else {
#Throw a message if failed, not sure what might cause this
errmsg <= paste0("Failed to cast '", class(l[[i]]), "' as a list at: ", paste(c(loc, i), collapse = ", "))
throw( errmsg )
}
}
} else {
#Found valid data
if (verbose > 1) print(paste0("Found ", class(l[[i]]), " at: ", paste(c(loc, i), collapse = ", ")))
}
}
#Return this part of the list unless not fixing anything and this is the first call
return(if((!fix) & (length(loc) == 0)) {invisible()} else {l} )
}
#A list with a problem
lst <- list(list("a", "b",data.frame(a=c(1,2))), 2)
#Look for problems
isvalid(lst, verbose = 1)
#Fix problems
lst <- isvalid(lst, fix=TRUE, verbose = 1)
#Show the new data structure
isvalid(lst, verbose = 2)
Notez que j'ai essayé d'inclure des données binaires brutes dans la liste et que cela a été récursif jusqu'à ce que je reçois une erreur de débordement. Si vous rencontrez cela, vous devrez peut-être faire autre chose.
Re: Récupérer la liste imbriquée de listes de R à JMP @ih ,
Cela nous mène dans la bonne voie. Si je ne suis pas cupide, j'aimerais m'aventurer et poser une autre question.
isvalid <- function(l, loc = {} )
{
for( i in seq_along(l) )
{
if( class(l[[i]]) == "list" )
{
isvalid(l[[i]], c(loc, i))
} else if (!(class(l[[i]]) %in% c("numeric", "character")))
{
l[i] <- as.list(l[i])
#print(paste0("Invalid data found at: ", paste(c(loc, i), collapse = ", ")))
} else
{
#print(paste0("Valid data found at: ", paste(c(loc, i), collapse = ", ")))
}
}
}
isvalid(DesResult)J'ai ajouté une ligne pour convertir les données non valides trouvées dans une liste - en espérant que cela résoudrait le problème. Cependant, je ne pense pas que cela a fonctionné comme prévu. Des idées sur la façon de résoudre ce problème?
Re: Récupérer la liste imbriquée de listes de R à JMPJ'ai souvent des erreurs étranges lorsque j'essaie d'importer des types de données non valides. Vous pouvez essayer de vérifier chaque élément de votre liste pour vous assurer qu'il s'agit bien d'une liste, d'un nombre ou d'une chaîne. Voici un moyen de le faire (non testé à fond):
isvalid <- function(l, loc = {} ) {
for( i in seq_along(l) ) {
if( class(l[[i]]) == "list" ) {
isvalid(l[[i]], c(loc, i))
} else if (!(class(l[[i]]) %in% c("numeric", "character"))) {
print(paste0("Invalid data found at: ", paste(c(loc, i), collapse = ", ")))
} else {
#print(paste0("Valid data found at: ", paste(c(loc, i), collapse = ", ")))
}
}
}
lst = list(list("a", "b",data.frame(a=c(1,2))), 2)
isvalid(lst)Qui retourne:
> lst = list(list("a", "b",data.frame(a=c(1,2))), 2)
> isvalid(lst)
[1] "Invalid data found at: 1, 3"Re: Récupérer la liste imbriquée de listes de R à JMP @ih ,
Dans mon cas, je n'essaie pas de m'inscrire dans les listes. J'ai essayé votre exemple et cela fonctionne parfaitement, cependant, quand j'essaie exactement la même chose de mon côté, je ne comprends pas pourquoi j'échoue.
J'ai vérifié si les données sont stockées sous forme de liste dans R et il s'agit bien d'une liste.

En JMP, voici ce que je fais:
DesResult = R Get("DesResult"); Cela donne toujours la même erreur, mais cela n’a aucun sens car votre exemple montre clairement qu’il devrait être récupérable.
Re: Récupérer la liste imbriquée de listes de R à JMPR Get récupérera les listes imbriquées de R. Vous devez obtenir la liste complète (je ne pense pas que vous puissiez indiquer la commande R Get) et il se débat avec les trames de données contenant des listes, ou autre chose que des chiffres et des caractères.
Names default to here( 1 );
R Init();
R Submit( "\[
a <- list( 1, 2, list("a", list( "b", "c" ) ) )
]\");
a = R Get( "a" );
Show( a[3][2][1] );
R Term();