R에서 JMP 목록의 중첩 목록 검색여러분 안녕하세요,
R을 사용하여 API에서 정보를 가져오고 정보를 JMP로 가져옵니다. API가 목록의 중첩 목록을 반환 할 때까지 데이터 검색에 성공했습니다.
오류없이 R Studio에서 동일한 코드를 실행할 수 있기 때문에 오류가 R 쪽에서 표시되지 않는다고 생각합니다. JSL에서도 R Get ()을 사용하여 R에서 JMP로 객체를 검색하려고 할 때만 오류가 발생합니다. 시도 할 때 아래와 같은 오류가 발생합니다.
R Get(A) ;
R Get ()은 목록 검색을 지원합니다 - 내가 잘못하고있는 것이 있습니까?

또한 목록의 중첩 목록이 있기 때문에 목록의 내용을 반복하면 데이터를 추출하는 가장 효율적인 방법인지 궁금하십니까?
제목 : Re : J에서 목록 중첩 된 목록 검색그것은 더 복잡합니다. 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 : J에서 목록 중첩 된 목록 검색 @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 : J에서 목록 중첩 된 목록 검색잘못된 데이터 유형을 가져올 때 종종 이상한 오류가 발생합니다. 목록의 모든 요소를 검사하여 목록, 숫자 또는 문자열인지 확인할 수 있습니다. 이 작업을 수행하는 한 가지 방법이 있습니다 (철저히 테스트하지 않은 경우).
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 : J에서 목록 중첩 된 목록 검색 @ih ,
필자의 경우, 나는 목록에 가입하려고하지 않는다. 나는 당신의 모범을 보았지만 그것은 완벽하게 작동합니다, 그러나 제 마지막에 똑같은 것을 시도 할 때, 나는 왜 실패하고 있는지 이해하지 못합니다.
데이터가 R에 목록으로 저장되어 있는지 확인하고 실제로 목록입니다.

JMP에서 내가하는 일은 다음과 같습니다.
DesResult = R Get("DesResult"); 여전히 같은 오류를 보여 주지만, 예제가 검색 가능해야한다는 것을 분명히 보여주기 때문에 의미가 없습니다.
제목 : Re : J에서 목록 중첩 된 목록 검색R Get은 R에서 중첩 목록을 가져옵니다. 전체 목록을 가져와야합니다 (R Get 명령에 subscript 할 수는 없다고 생각합니다). 목록이나 숫자 나 문자 이외의 데이터 프레임이 있으면 고생하게됩니다.
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();