TERR에서 apply()를 실행할 때 "아래 첨자가 범위를 벗어났습니다"가 발생하지만 일반 R에서는 작동합니다.
문제
Spotfire Professional에서 다음 코드 조각을 "R 스크립트 - Tibco Enterprise Runtime for R"로 실행하려고 하면:
mydata_broken <- structure(
list(
Var1 = list(3.99083333270391, 3.99083333270391, 3.99083333270391, 3.99083333270391),
Var2 = list(3.99083333270391, 3.99083333270391, 3.99083333270391, 3.99083333270391)),
row.names = c("1", "2", "3", "4"),
class = "data.frame",
out.attrs = list(dim = c(2L, 2L),
dimnames = list(
Var1 = c("Var1=3.99083333270391", "Var1=3.99083333270391"),
Var2 = c("Var2=3.99083333270391", "Var2=3.99083333270391")
)
)
)
mydata_ok <- structure(
list(
Var1 = list(3.99083333270391),
Var2 = list(3.99083333270391)),
row.names = "1",
class = "data.frame",
out.attrs = list(dim = c(1L, 1L),
dimnames = list(
Var1 = "Var1=3.99083333270391",
Var2 = "Var2=3.99083333270391")
)
)
out <- apply(mydata_broken, 1, function(y) mean(as.numeric(y)))
다음과 같은 오류 메시지가 나타납니다.
R용 TIBCO Enterprise Runtime이 오류를 반환했습니다.'expand.names(x) 오류:아래 첨자가 범위를 벗어났습니다.'Spotfire.Dxp.Data.DataFunctions.Executors.LocalFunctionClient.OnExecuting(FunctionClient funcClient)
(나머지 스택 추적 생략)
그러나 동일한 코드는 일반 R에서도 완벽하게 작동합니다.내가 교체하면 mydata_broken
~와 함께 mydata_ok
통화 중 apply()
, 모든 것이 예상대로 작동합니다(TERR 및 일반 R 모두에서).
지금까지 시도한 것:
- 사용
yy
대신에y
제공된 익명 함수에서apply()
(관련된 어리석은 명명 문제를 배제하기 위해y
) - 모든 것을 한 곳에 넣어라
local({...})
제안한대로 R에서 차단하고 확인하십시오. 왜 Shiny에서는 "범위를 벗어난 첨자" 오류가 발생하지만 R에서는 발생하지 않습니까?
버전 및 구성 정보
- Spotfire 5.5.0, 빌드 버전 5.5.0.31, 빌드 날짜:2013년 5월 22일
- R 버전 3.0.2, 64비트(2013-09-25)
- 윈도우 7, 64비트
그래서 내 질문은 다음과 같습니다.내가 여기서 어리석은 실수를 하고 있는 걸까?아니면 Spotfire R 런타임의 버그입니까?
업데이트Spotfire 지원으로부터 실행 가능한 해결 방법을 얻었고 이를 답변으로 추가하고 싶기 때문에 질문을 다시 열고 싶습니다.
해결책
Spotfire 지원팀으로부터 받은 응답을 간략하게 요약하면 다음과 같습니다.
- 그것은 실제로 TERR의 버그입니다(분명히 TERR은
list()
구조가 제대로 작동하지 않아 생성하려는 매트릭스의 크기에 결함이 발생합니다.)그들은 현재 그것을 고치기 위해 노력하고 있습니다 - 해결 방법으로 다음을 사용할 수 있습니다.
c()
대신에list()
데이터 정의에서
TERR에서 작동하는 데이터 정의 수정
mydata_working <- structure(
list(
Var1 = c(3.99083333270391, 3.99083333270391, 3.99083333270391, 3.99083333270391),
Var2 = c(3.99083333270391, 3.99083333270391, 3.99083333270391, 3.99083333270391)),
row.names = c("1", "2", "3", "4"),
class = "data.frame",
out.attrs = list(dim = c(2L, 2L),
dimnames = list(
Var1 = c("Var1=3.99083333270391", "Var1=3.99083333270391"),
Var2 = c("Var2=3.99083333270391", "Var2=3.99083333270391")
)
)
)
제휴하지 않습니다 StackOverflow