"Indice hors limites" lors de l'exécution de apply() dans TERR, mais fonctionne en R simple
Question
Lorsque j'essaie d'exécuter le morceau de code suivant dans Spotfire Professional en tant que « Script 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)))
Je reçois le message d'erreur suivant:
TIBCO Enterprise Runtime for R a renvoyé une erreur :'Erreur dans expand.names(x) :indice hors limites ».sur Spotfire.Dxp.Data.DataFunctions.Executors.LocalFunctionClient.OnExecuting(FunctionClient funcClient)
(reste de la trace de la pile omis)
Cependant, le même code fonctionne parfaitement en R simple.Si je remplace mydata_broken
avec mydata_ok
dans l'appel à apply()
, tout fonctionne comme prévu (à la fois en TERR et en plain R).
Choses que j'ai essayées jusqu'à présent :
- utiliser
yy
au lieu dey
dans la fonction anonyme fournie àapply()
(pour exclure certains problèmes de dénomination stupides concernanty
) - mettre le tout dans un
local({...})
bloquer et vérifier dans R, comme cela a été suggéré dans pourquoi une erreur « indice hors limites » dans Shiny, mais pas R ?
Informations sur la version et la configuration
- Spotfire 5.5.0, version 5.5.0.31, date de build :22.05.2013
- R version 3.0.2, 64 bits (25/09/2013)
- Windows 7, 64 bits
Donc, ma question est :Est-ce que je fais une erreur stupide ici ?Ou s'agit-il d'un bug dans le runtime Spotfire R ?
MISE À JOURJ'aimerais rouvrir la question, car j'ai obtenu une solution de contournement viable auprès du support Spotfire, et j'aimerais l'ajouter comme réponse.
La solution
Voici un bref résumé de la réponse que j'ai reçue du support Spotfire :
- c'est bien un bug de TERR (apparemment, TERR n'est pas capable de lire le
list()
structure correctement, provoquant un défaut dans les dimensions de la matrice qu'elle était censée créer) ;ils travaillent actuellement à le réparer - comme solution de contournement, vous pouvez utiliser
c()
au lieu delist()
dans la définition des données
Définition modifiée des données qui fonctionnent dans 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")
)
)
)