RからJMPへのリストのネストしたリストの取得こんにちは皆さん、
私はRを使ってAPIから情報を引き出し、その情報をJMPに取り込んでいます。APIがネストされたリストのリストを返すまで、データの取得に成功しました。
私はエラーがR側から促されないと考えています、なぜなら私はエラーなしでR Studioで同じコードを実行することができるからです。JSLであっても、R Get()を使用してRからJMPにオブジェクトを取得しようとしているときにのみエラーが発生します。試してみると、以下のようなエラーが表示されます。
R Get(A) ;
R Get()はリストの検索をサポートしています - 間違っていることはありますか?

また、私はリストのリストを入れ子にしているので - リストの内容をループすることがデータを取り出すための最も効率的な方法であるかどうか疑問に思う?
再: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)
リスト内に生のバイナリデータを含めようとしたところ、オーバーフローエラーが発生するまでそれが再帰されたことに注意してください。あなたがそれに遭遇した場合、あなたは何か他のことをする必要があるかもしれません。
再: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")))
{
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)私は基本的にリストに見つかった無効なデータをキャストするために1行を追加しました - これが問題を解決することを願って。しかし、私はそれが思ったようにうまくいったとは思わない。それを修正する方法についての任意の考え?
再:RからJMPへのリストのネストしたリストの取得無効なデータ型をインポートしようとすると、奇妙なエラーが発生することがよくあります。リスト内のすべての要素を調べて、それがリスト、数字、または文字列であることを確認してください。これを実行する1つの方法があります(完全にはテストされていません)。
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"再:RからJMPへのリストのネストしたリストの取得ああ 、
私の場合、私はリストに添字を付けようとしていません。私はあなたの例を試しました、そして、それは完全に働きます、しかし、私が私の側でまったく同じことを試みるとき、私はなぜ失敗しているのかわかりません。
データがRのリストとして格納されているかどうかを確認しましたが、実際にはリストです。

JMPでは、これが私のやり方です。
DesResult = R Get("DesResult"); それでも同じエラーが発生しますが、これは意味がありません。あなたの例は明らかにそれが検索可能であるべきであることを示しているからです。
再: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();