Recuperar listas anidadas de listas de R a JMPHola a todos,
Estoy extrayendo información de una API usando R y recuperando la información en JMP. He tenido éxito con la recuperación de datos hasta que la API devuelve una lista anidada de listas.
Estoy pensando que el error no se solicita desde el lado R porque puedo ejecutar la misma pieza de código en R Studio sin ningún error. Incluso en JSL, el error solo ocurre cuando intento recuperar el objeto de R a JMP usando R Get (). Me sale el error que se muestra a continuación cuando intento:
R Get(A) ;
R Get () admite la recuperación de listas: ¿hay algo que estoy haciendo mal?

Además, ya que tengo listas de listas anidadas, ¿me pregunto si recorrer los contenidos de la lista es la forma más eficiente de extraer los datos?
Re: Recuperar listas anidadas de listas de R a JMPEso es más complejo. En R, todos los argumentos se pasan por valor, por lo que incluso en la primera llamada, la modificación 'l' en realidad crea una copia dentro del espacio de nombres de la función y la lista que está intentando modificar está intacta. En las llamadas subsiguientes, está operando en versiones más pequeñas de 'l' que, de nuevo, no hacen referencia a su lista real. Para arreglar la lista, deberá volver a guardar una referencia en el espacio de nombres donde reside la lista y luego usar el argumento loc para averiguar qué parte emitir, o crear una nueva copia de la lista y devolverla. Yo hago lo último aquí:
#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)
Tenga en cuenta que intenté incluir datos binarios sin procesar dentro de la lista y se repitió hasta que obtuve un error de desbordamiento. Si te topas con eso, es posible que necesites hacer otra cosa.
Re: Recuperar listas anidadas de listas de R a JMP @ih ,
Eso nos está llevando al camino correcto. Si no estoy siendo codicioso, me gustaría aventurarme y hacer una pregunta más.
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)Agregué una línea para, básicamente, convertir los datos no válidos encontrados en una lista, con la esperanza de que esto solucionara el problema. Sin embargo, no creo que haya funcionado como esperaba. ¿Alguna idea sobre cómo solucionar eso?
Re: Recuperar listas anidadas de listas de R a JMPA menudo recibo errores extraños al intentar importar tipos de datos no válidos. Puede intentar revisar cada elemento de su lista para asegurarse de que sea una lista, un número o una cadena. Aquí hay una forma de hacerlo (no probado a fondo):
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)Que devuelve:
> lst = list(list("a", "b",data.frame(a=c(1,2))), 2)
> isvalid(lst)
[1] "Invalid data found at: 1, 3"Re: Recuperar listas anidadas de listas de R a JMP @ih ,
En mi caso, no estoy tratando de subscribir en las listas. Intenté tu ejemplo y funciona perfectamente, sin embargo, cuando intento exactamente lo mismo en mi final, no entiendo por qué estoy fallando.
Verifiqué si los datos están almacenados como una lista en R y de hecho es una lista.

En JMP, esto es lo que hago:
DesResult = R Get("DesResult"); Todavía da el mismo error, pero eso no tiene sentido porque su ejemplo demuestra claramente que debería ser recuperable
Re: Recuperar listas anidadas de listas de R a JMPR Get recuperará las listas anidadas de R. Necesita obtener la lista completa (no creo que pueda hacer un subíndice en el comando R Get) y tiene problemas con los marcos de datos que contienen listas, o cualquier otra cosa que no sean números y caracteres.
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();