«Индекс выходит за пределы» при запуске apply() в TERR, но работает в простом R
Вопрос
Когда я пытаюсь запустить следующий фрагмент кода в Spotfire Professional как «R Script — 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)))
Я получаю следующее сообщение об ошибке:
TIBCO Enterprise Runtime for R вернул ошибку:'Ошибка в расширении.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, дата сборки:22.05.2013
- Версия R 3.0.2, 64-битная (25 сентября 2013 г.)
- Windows 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")
)
)
)