2014-12-19 14 views
14

La mia domanda può sembrare stupida, ma ho notato che . e % sono spesso utilizzati in R e sinceramente non so perché viene utilizzato.Cosa fare. (punto) e% (percentuale) significano in R?

ho visto in dplyr (andare here per un esempio) e data.table (vale a dire .SD), ma sono sicuro che deve essere utilizzato in altro luogo pure.

Pertanto, la mia domanda è:

  • Cosa . significa? È una specie di nomenclatura delle migliori pratiche di codifica R? (Ad esempio, _functionName viene spesso utilizzato in javascript per indicare che si tratta di una funzione privata). Se sì, qual è la regola?
  • Stessa domanda per %, che viene spesso utilizzata anche in R (ad esempio %in%, %>%, ...).

La mia ipotesi è sempre stata che . e % sono un modo conveniente per chiamare rapidamente la funzione, ma il modo in cui utilizza data.table. non segue questa logica, che mi confonde.

+0

% è appena utilizzato in molti operatori, è possibile definire anche il proprio operatore, ad esempio '"% nin% "<- funzione (x, y) {! (X% in% y)}'. Controlla il pacchetto 'magrittr', molti dei recenti% e. sono dall'utilizzo di quel pacchetto. –

+0

Vedere anche [** qui **] (http://stackoverflow.com/questions/22314680/how-to-use-the-operator-in-r). Basta notare che '%.%' Discusso in quella domanda è deprecato, e '%>%' dovrebbe essere usato ora. – Henrik

+0

@ Henrik e @daattali, grazie per la tua risposta. Lo sapevo. La mia domanda riguardava più se c'è una regola di programmazione come quando si codifica con '' '%' '' o '' .''' a cui ha risposto MrFlick. – zipp

risposta

22

. non ha alcun significato intrinseco/magico in R. È solo un altro carattere che è possibile utilizzare nei nomi di simboli. Ma perché è così comoda per digitare, è stato dato un significato speciale per determinate funzioni e convenzioni in R. Qui ci sono solo alcune

  • . viene utilizzato guardare in alto S3 metodo generico implementazioni. Ad esempio, se si chiama una funzione generica come plot con un oggetto della classe lm come primo parametro, allora cercherà una funzione denominata plot.lm e, se trovata, la chiamerà.
  • spesso . nelle formule significa "tutte le altre variabili", ad esempio lm(y~., data=dd) regredisce su tutte le altre variabili nel data.frame dd.
  • librerie come dplyr usarlo come un nome di variabile speciale indica il data.frame corrente per metodi come do(). Si potrebbe facilmente hanno scelto di utilizzare il nome della variabile X invece
  • funzioni come bquote uso .() come una funzione speciale per sfuggire variabili nelle espressioni
  • variabili che iniziano con un periodo sono considerati "nascosto" e non verranno visualizzate con ls() a meno che non si chiama ls(all.names=TRUE) (simile al comportamento del file system UNIX)

Tuttavia, si può anche solo definire una variabile denominata my.awesome.variable<-42 e funzionerà proprio come qualsiasi altra variabile.

A % di per sé non significa nulla di speciale, ma R consente di definire i propri operatori di infisso nel formato %<something>% utilizzando due segni di percentuale.Se si definisce

`%myfun%` <- function(a,b) { 
    a*3-b*2 
} 

si può chiamare come

5 %myfun% 2 
# [1] 11 
+0

Ok, grazie. Mi stavo chiedendo se avesse un nome di convenzione speciale e tu avessi risposto perfettamente. Grazie. – zipp

+6

Un paio di altri usi per '.': nelle formule del modello, ad esempio,' lm (var ~., Data = df) 'il punto significa" tutte le altre variabili in 'df' oltre a' var'. " In 'dplyr' è usato come un" pronome "per fare riferimento al frame di dati corrente (vedere [qui] (http://blog.rstudio.org/2014/05/21/dplyr-0-2/), ad esempio). – eipi10

+0

@ eipi10 grazie. Ecco perché mi sono confuso che spesso è in molti casi. Mi stavo chiedendo se ci fosse una sorta di logica dietro di esso. – zipp

6

Questa risposta non copre l'utilizzo di . in data.table;

In data.table, . è (essentially) un alias per list, quindi qualsiasi * chiamata a [.data.table che accetta un list può anche essere passato un oggetto avvolto in .().

Così i seguenti sono equivalenti:

DT[ , .(x, y)] 
DT[ , list(x, y)] 

* Beh, non proprio. qualsiasi uso nell'argomento j, sì; altrove è un work in progress, see here.

+0

Grazie per il tuo contributo. Una nota a margine è che la domanda non era dove veniva usata, ma se aveva un significato speciale come "_" essere usato come privato. – zipp

+0

@zipp il "significato speciale" è 'lista'. E "_" essere usato per "privato" non è niente di ufficiale. – MichaelChirico