Esecuzione di funzioni definite dall'utente

Le funzioni definite dall'utente possono essere eseguite su ogni riga o su ogni gruppo di righe, in base a una colonna di raggruppamento. Il primo caso è coperto da 'nzApply(), la seconda funzionalità è realizzata dalla funzione 'nzTAapply(). Esistono anche due funzioni più flessibili, 'nzRun() e 'nzRunHost(), che consentono agli utenti di iterare i dati manualmente.

nzApply

La funzione 'nzApply() applica una funzione fornita dall'utente a ogni riga di un dato frame di dati distribuito (nz.data.frame). Per ogni riga elaborata, si aspetta al massimo una riga di risultato (vettore, elenco) che viene inserita nell'uscita 'mz.data.frame.
data(iris)
if (nzExistTable('iris')) {nzDeleteTable('iris')}
d <-as.nz.data.frame(iris)
f <- function(x) { return(sqrt(x[[1]])) }
if (nzExistTable('apply_output')) nzDeleteTable('apply_output')
r <- nzApply(d[,1], NULL, f, output.name='apply_output',
output.signature=list(SQUAREROOT=NZ.DOUBLE))
head(r)
# SQUAREROOT
#1 2.645751
#2 2.626785
#3 2.366432
#4 2.366432
#5 2.366432
#6 2.366432
# this exists also as an overloaded apply method and the following
# returns the same result
nzDeleteTable('apply_output')
r <- apply(d[,1], NULL, f, output.name='apply_output',
output.signature=list(SQUAREROOT=NZ.DOUBLE))
Quando si applica una funzione a una tabella, fare attenzione ai tipi di dati. Specificare l'esatto sottoinsieme di colonne i cui tipi corrispondono a quelli attesi dalla funzione, oppure aggiungere il casting delle colonne al formato desiderato per la funzione data:
f <- function(x) { return(sqrt(as.numeric(x[[1]]))) }
if (nzExistTable('apply_output')) nzDeleteTable('apply_output')
r <- nzApply(d, NULL, f, output.name='apply_output',
output.signature=list(SQUAREROOT=NZ.DOUBLE))
head(r)
# SQUAREROOT
#1 2.258318
#2 2.213594
#3 2.213594
#4 2.258318
#5 2.258318
#6 2.258318

nzTApply

La funzione 'nzTApply() applica una funzione fornita dall'utente a ciascun sottoinsieme (gruppo di righe) di un dato frame di dati distribuito (nz.data.frame). I sottoinsiemi sono determinati da una colonna indice specificata. I risultati dell'applicazione delle funzioni vengono inseriti in una cornice di dati. Nell'esempio seguente, viene utilizzato lo stesso " nz.data.frame dell'esempio " nzApply(). L'esempio contiene il set di dati dell'iride.
print(d)
#SELECT Sepal_Length,Sepal_Width,Petal_Length,Petal_Width, Species FROM nziris
# the following lines do the same - compute the mean value
# in every group
nzTApply(d, d[,5], mean)
nzTApply(d, 'Species', mean)
nzTApply(d, 5, mean)
# Sepal_Length Sepal_Width Petal_Length Petal_Width Species Species
#1 6.588 2.974 5.552 2.026 nan virginica
#2 5.006 3.428 1.462 0.246 nan setosa
#3 5.936 2.770 4.260 1.326 nan versicolor

Dettagli

L'output di queste funzioni dipende dalla specificazione di 'output.name e 'output.signature. Per 'nzApply(), viene restituito un oggetto di classe 'data.frame. L'oggetto ha lo stesso numero di colonne delle sequenze restituite da fun. Se il output.name non viene fornito, non viene creata alcuna tabella. Per il 'nzTApply(), se viene fornito un 'output.name, deve essere specificato anche il 'output.signature. Il parametro 'output.signature può essere usato per evitare di ricevere una tabella rada e per impostare i tipi di colonne di output desiderati; se il parametro viene fornito, 'fun deve restituire valori che possono essere lanciati a questi tipi.

Se la funzione 'fun causa errori, è possibile utilizzare la modalità debugger per analizzare le condizioni in cui si verificano gli errori. Se 'debugger.mode=TRUE, la tabella dei risultati non viene memorizzata nel sistema Netezza. Invece, per ogni gruppo viene richiamato un test diagnostico e l'ambiente del primo gruppo che causa un errore viene trasportato al client R locale e aperto nel debugger R.

Si consideri il seguente codice R:
nziris = nz.data.frame('iris')
FUN5 = function(x) {
if(min(x[,1]) < 4.5) cov(0) else min(x[,1])
} nzTApply(nziris, 5, FUN5, debugger.mode=T)
In modalità debug, la funzione 'nzTApply() restituisce un riepilogo per l'elaborazione del gruppo. Questo riepilogo è presentato in una tabella con le seguenti colonne:
  • La prima colonna contiene la descrizione dell'esito o dell'errore.
  • La seconda colonna contiene il tipo di esito (try-error in caso di errore).
  • La terza colonna contiene il nome del gruppo per il quale viene restituito il risultato dato In questo esempio, ci sono tre gruppi, di cui uno produce un errore.
Found 1 error
values type group
1 101 integer virginica
2 supply both 'x' and 'y' or a matrix-like 'x' try-error setosa
3 51 integer versicolor
Quindi, per il primo gruppo che ha causato un errore, viene scaricato un ambiente di dump dalla SPU remota al client R e aperto nel debugger R.
nzApply(X, MARGIN, FUN, output.name = NULL, output.signature =
NULL, clear.existing = FALSE, ...)
nzTApply(X, INDEX, FUN = NULL, output.name = NULL, output.signature = NULL,
clear.existing = FALSE, debugger.mode = FALSE, ..., simplify = TRUE)
dove:
X
Specifica la struttura dei dati di input.
Margine
Attualmente non viene utilizzato, ma l'argomento è necessario; deve essere passato NULL.
Fun
Specifica la funzione definita dall'utente.
FUN può restituire un valore scalare o una riga. Riceve un sottoinsieme dei dati di input sotto forma di data.frame con i nomi delle colonne in minuscolo.
output.name
Specifica il nome della tabella di output creata sul sistema Netezza.
output.signature
Indica i tipi di dati per le colonne della tabella di output. Se non viene fornita, viene creata una tabella generica (rada).
clear.existing
Se 'TRUE, eliminare la tabella di output se attualmente esiste.
debugger.mode
Ii 'TRUE, 'nzTApply funziona in modalità debugger.
...
Questi argomenti vengono passati a 'fun.
semplificare
Non utilizzato, incluso per compatibilità.
Indice
Il valore utilizzato per indicizzare l'insieme di dati in cui " INDEX può essere fornito come uno dei seguenti elementi:
  • Una stringa di caratteri il cui valore deve essere presente tra le colonne di 'X.
  • Un numero intero non superiore al numero di colonne di 'X.