"Personale dei limiti" quando si esegue applicare () in Ter, ma funziona in modo semplice r
Domanda
Quando provo a eseguire il seguente pezzo di codice in SpotFire Professional come A "R Script - Tibco Enterprise Runtime per 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)))
.
ottengo il seguente messaggio di errore:
Tibco Enterprise Runtime per R ha restituito un errore: "Errore in Expand.Names (X): subscript fuori limite '. a spotfire.dxp.data.datafunctions.executor.localfunctionclient.onexecuting (funcblclient funclient)
(resto della traccia dello stack omessa)
Tuttavia, lo stesso codice funziona in modo impeccabile in Bintalo R.
Se sostituisco mydata_broken
con mydata_ok
nella chiamata a apply()
, tutto funziona come previsto (sia in Terr e Pola R).
Cose che ho provato finora:
- .
- Utilizzare
yy
anzichéy
nella funzione anonima fornita aapply()
(per escludere alcuni stupidi problemi di denominazione relativi ay
) - Metti tutto in un blocco
local({...})
e controllalo in r, come è stato suggerito in Perché un errore" subscript out of limits "in lucente, ma non r?
Versione e informazioni di configurazione
- .
- Spotfire 5.5.0, Build Version 5.5.0.31, Data di costruzione: 22.05.2013
- R versione 3.0.2, 64 bit (2013-09-25)
- Windows 7, 64 bit
Allora, la mia domanda è: sto facendo qualche stupido errore qui? O è un bug nel spotfire r runtime?
Aggiornamento Mi piacerebbe riaprire la domanda, perché ho ottenuto un workaround praticabile dal sostegno del Spotfire, e mi piacerebbe aggiungerlo come risposta.
Soluzione
Ecco un breve riassunto della risposta che ho ricevuto dal supporto SpotFire:
- .
- È infatti un bug in Terra (apparentemente, Terriera non è in grado di leggere correttamente la struttura
list()
, causando un guasto nelle dimensioni della matrice che avrebbe dovuto creare);Attualmente stanno lavorando per fissarlo - Come soluzione alternativa, è possibile utilizzare
c()
anzichélist()
nella definizione dei dati
Definizione modificata dei dati che funziona in Terra
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")
)
)
)
.