Abrufen verschachtelter Listenlisten von R an JMPHallo alle,
Ich hole Informationen aus einer API mithilfe von R und rufe die Informationen in JMP ab. Ich war mit dem Datenabruf erfolgreich, bis die API eine verschachtelte Listenliste zurückgibt.
Ich denke, der Fehler wird nicht von der R-Seite angezeigt, da ich in R Studio denselben Code fehlerfrei ausführen kann. Selbst in JSL tritt der Fehler nur auf, wenn ich versuche, das Objekt von R nach JMP mithilfe von R Get () abzurufen. Ich erhalte die Fehlermeldung, wenn ich es versuche:
R Get(A) ;
R Get () unterstützt das Abrufen von Listen. Gibt es etwas, das ich falsch mache?

Auch, da ich verschachtelte Listen von Listen habe - frage ich mich, ob das Durchsuchen des Listeninhalts der effizienteste Weg ist, die Daten zu extrahieren?
Betreff: Abrufen verschachtelter Listen von R nach JMPDas ist komplexer. In R werden alle Argumente als Wert übergeben, sodass beim ersten Aufruf von 'l' tatsächlich eine Kopie davon im Namespace der Funktion erstellt wird und die Liste, die Sie ändern möchten, nicht betroffen ist. Bei nachfolgenden Aufrufen arbeiten Sie mit kleineren Versionen von 'l', die wiederum nicht auf Ihre tatsächliche Liste verweisen. Um die Liste zu korrigieren, müssen Sie entweder einen Verweis in dem Namespace speichern, in dem sich die Liste befindet, und dann mit dem Argument loc herausfinden, welcher Teil umgewandelt werden soll, oder eine neue Kopie der Liste erstellen und zurückgeben. Letzteres mache ich hier:
#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)
Beachten Sie, dass ich versucht habe, binäre Rohdaten in die Liste aufzunehmen, und es wurde rekursiert, bis ein Überlauffehler angezeigt wurde. Wenn Sie dem begegnen, müssen Sie möglicherweise etwas anderes tun.
Betreff: Abrufen verschachtelter Listen von R nach JMP @ich h .
Das führt uns in die richtige Richtung. Wenn ich nicht gierig bin, würde ich gerne eine weitere Frage stellen.
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)Ich fügte eine Zeile hinzu, um die gefundenen ungültigen Daten im Grunde in eine Liste umzuwandeln - in der Hoffnung, dass dies das Problem beheben würde. Ich glaube jedoch nicht, dass es wie erwartet funktioniert hat. Irgendwelche Gedanken, wie man das beheben kann?
Betreff: Abrufen verschachtelter Listen von R nach JMPIch bekomme oft seltsame Fehler beim Importieren ungültiger Datentypen. Sie können jedes Element in Ihrer Liste überprüfen, um sicherzustellen, dass es sich entweder um eine Liste, eine Zahl oder eine Zeichenfolge handelt. Hier ist eine Möglichkeit (nicht gründlich getestet):
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)Welche gibt zurück:
> lst = list(list("a", "b",data.frame(a=c(1,2))), 2)
> isvalid(lst)
[1] "Invalid data found at: 1, 3"Betreff: Abrufen verschachtelter Listen von R nach JMP @ich h .
In meinem Fall versuche ich nicht, die Listen zu abonnieren. Ich habe Ihr Beispiel ausprobiert und es funktioniert perfekt. Wenn ich jedoch an meinem Ende genau dasselbe versuche, verstehe ich nicht, warum ich versage.
Ich habe geprüft, ob die Daten als Liste in R gespeichert sind und es sich tatsächlich um eine Liste handelt.

In JMP mache ich Folgendes:
DesResult = R Get("DesResult"); Es gibt immer noch den gleichen Fehler, aber das macht keinen Sinn, weil Ihr Beispiel eindeutig zeigt, dass es abrufbar sein sollte
Betreff: Abrufen verschachtelter Listen von R nach JMPR Get ruft verschachtelte Listen von R ab. Sie müssen die gesamte Liste abrufen (ich glaube nicht, dass Sie mit dem Befehl R Get einen Index erstellen können), und es kämpft mit Datenrahmen, die Listen enthalten, oder andere als Zahlen und Zeichen.
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();