從R到JMP檢索列表的列表大家好,
我使用R從API中提取信息並將信息檢索到JMP中。我已成功完成數據檢索,直到API返回嵌套的列表列表。
我認為R端沒有提示錯誤,因為我能夠在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();