2015-03-12 20 views
5

Le decisioni di progettazione per il comportamento predefinito di R sono ottimizzate per l'uso interattivo, ma possono comportare un comportamento indesiderato in codebase di grandi dimensioni eseguiti senza molta sorveglianza dell'utente. Sarei interessato a trovare modi per rendere la lingua un po 'più rigida. Ho due esempi di base.modifica comportamento predefinito operatore

(riciclaggio) vettori non congruenti vengono riciclati in operazioni arythmetic:

> x=1:10 
> y=1:20 
> y=rep(1,20) 
> x+y 
[1] 2 3 4 5 6 7 8 9 10 11 2 3 4 5 6 7 8 9 10 11 

C'è un modo per rendere questo risultato il funzionamento in un errore?

(conversione) conversioni si verificano durante l'aggiornamento vettori, a volte cambiando il tipo di elemento essendo aggiornato, talvolta il tipo del vettore:

> x[1] <- 'a' 
> x 
[1] "a" "2" "3" "4" "5" "6" "7" "8" "9" "10" 
> x[1] <- 1 
> x 
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" 

Esiste un modo per fare questo risultato dell'operazione in errore?

Credo che gran parte della frustrazione degli utenti nuovi e intermedi derivi da comportamenti come questi (che a loro volta si traducono in un giudizio sintetico sulla lingua!). Qualsiasi puntatore a approcci generali per affrontare il riciclaggio e la conversione è molto gradito.

+1

Il riciclaggio e la conversione sono proprietà fondamentali della lingua. Entrambi sono implementati a livello C. Imho cambiando questo in generale richiederebbe la modifica del codice sorgente di base e la ricostruzione di R. Sarebbe un compito non banale e ci si può aspettare che rompa molte, molte altre funzioni. Potresti, ad esempio, scrivere metodi '+' per alcune classi che testano se l'input è di uguale lunghezza, ma ci sarebbero costi di performance significativi e sembra che tu abbia qualcosa di più generale in mente. – Roland

+1

Ciò che Roland ha detto è giusto e non dovresti rovinare le funzioni originali, ma puoi creare la tua funzione simile senza una grossa perdita di prestazioni, ad esempio '' '' "% +%" <- function (x, y) {stopifnot (length (x) == length (y)); '+' (x, y)} '' '' quindi puoi testarlo con 'x% +% y' –

+0

Per il riciclaggio puoi guardare [questa domanda e i suoi commenti] (http://stackoverflow.com/questions/9424976/incondizionati-warnings-quando-riciclaggio). Sembra che sia impossibile modificare questa caratteristica R di base. – agstudy

risposta

0

Per l'aggiunta. David ha ragione sul punto. Il codice sensibile a verificare questo genere di cose all'entrata di una funzione o almeno alla fine:

require(testthat) 
    expect_equal(length(out), length (mainEntry)) 

La conversione è anche una questione molto delicata. Nel codice di importante a specificare il tipo nell'assegnazione:

X[1] <- as.numeric("a") 

alzerà un avvertimento. È anche possibile definire classi che impediscono le conversioni utilizzando S4 classes.

Sfortunatamente per i principianti questo potrebbe non essere il più facile da seguire, ma i principianti dovrebbero comunque gestire il codice critico?

Problemi correlati