从R到JMP检索列表的列表大家好,
我使用R从API中提取信息并将信息检索到JMP中。我已成功完成数据检索,直到API返回嵌套的列表列表。
我认为R side没有提示错误,因为我可以在R Studio中执行相同的代码而没有任何错误。即使在JSL中,只有在我尝试使用R Get()将对象从R检索到JMP时才会出现错误。我尝试时收到以下错误:
R Get(A) ;
R Get()支持列表检索 - 我做错了吗?

此外,因为我有嵌套的列表列表 - 想知道循环列表的内容是否是提取数据的最有效方法?
Re:从R到JMP检索列表的列表那更复杂。 在R中,所有参数都是通过值传递的,因此即使在第一次调用中,修改“l”实际上在函数的命名空间内创建了它的副本,并且您尝试修改的列表不受影响。 在后续调用中,您正在使用较小版本的“l”进行操作,这些版本同样不会引用您的实际列表。 要修复列表,您需要将引用保存回列表所在的命名空间,然后使用loc参数确定要转换的部分,或者构建列表的新副本并将其返回。 我在这里做后者:
#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)
请注意,我尝试在列表中包含原始二进制数据并将其递归,直到出现溢出错误。如果遇到这种情况,您可能需要做其他事情。
Re:从R到JMP检索列表的列表 @ih ,
这导致我们走上正轨,如果我不贪心,我想冒险再问一个问题。
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)我添加了一行基本上将发现的无效数据转换为列表 - 希望这可以解决问题。但是,我认为它不像我预期的那样有效。有关如何解决这个问题的任何想法?
Re:从R到JMP检索列表的列表尝试导入无效数据类型时,我经常会遇到奇怪的错误。您可以尝试检查列表中的每个元素,以确保它是列表,数字或字符串。这是一种方法(未经过彻底测试):
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)哪个回报:
> lst = list(list("a", "b",data.frame(a=c(1,2))), 2)
> isvalid(lst)
[1] "Invalid data found at: 1, 3"Re:从R到JMP检索列表的列表 @ih ,
就我而言,我不打算下标到列表中。我尝试了你的例子并且它完美地工作,然而,当我尝试完全相同的东西时,我不明白为什么我失败了。
我检查了数据是否作为列表存储在R中,它确实是一个列表。

在JMP中,我就是这样做的:
DesResult = R Get("DesResult"); 它仍然提供相同的错误,但这没有任何意义,因为您的示例清楚地表明它应该是可检索的
Re:从R到JMP检索列表的列表R Get将从R中检索嵌套列表。您需要获取整个列表(我不相信您可以在R Get命令中下标)并且它与包含列表的数据框或数字和字符以外的任何内容相悖。
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();