2015-02-23 4 views

risposta

24

Se si utilizzano operatori con virgolette (ad esempio `+` o `*`), si stanno effettivamente utilizzando gli operatori standard con la tipica sintassi function.

Supponiamo di voler calcolare 1 + 2 in questo modo. Si potrebbe fare in questo modo:

`+`(1, 2) ## Please call the sum operator using 1 and 2 as arguments. 

Quindi, dal momento che l'espressione che hai postato è `+`(1, `*`(2, 3)), è fondamentalmente l'operatore somma, per i quali gli argomenti sono 1 e il risultato dell'operatore del prodotto, per il quale gli argomenti sono 2 e 3.

Eventualmente, un modo tipico per farlo è 1 + (2 * 3).

+0

Quanto interessante. In Haskell usi 'attorno a una funzione per trasformarla in un operatore infisso! –

10

Questa è la funzione "semplice" che chiama R. Ricordiamo che è una funzione, anche operatori,. Maggiori dettagli are in the R Language manual, section 3 on "Evaluation of Expressions".

In breve, quello che avete qui è 1 + 2 * 3 come dall'interno verso l'esterno:

  • Dobbiamo prima 2 * 3 come la funzione di moltiplicazione è chiamata
  • suo risultato è il secondo argomento in aggiunta a 1.
+0

Dovrebbe essere "Prima abbiamo' 2 * 3'? " – tospig

+0

Sì, grazie .. –

9

Questo mostra come iniziare a seguire l'albero di analisi di quell'espressione "funzionale" utilizzando gli operatori "[" e "[[" per estrarre i rami dell'albero. Espressione in R sono memorizzati in liste:

> quote(`+`(1, `*`(2, 3)))[1] 
`+`() 
> quote(`+`(1, `*`(2, 3)))[2] 
1() 
> quote(`+`(1, `*`(2, 3)))[[2]] 
[1] 1 
> quote(`+`(1, `*`(2, 3)))[3] 
(2 * 3)() 
> quote(`+`(1, `*`(2, 3)))[[3]] 
2 * 3 

Si noti che è lo stesso albero di analisi come il più convenzionale notazione infissa:

> quote(1+(2*3))[1] 
`+`() 
> quote(1+(2*3))[2] 
1() 
> quote(1+(2*3))[3] 
(2 * 3)() 
> quote(1+(2*3))[4] 
NULL() 
> quote(1+(2*3))[3][1] 
(2 * 3)() 
> quote(1+(2*3))[3][[1]] 
(2 * 3) 
> quote(1+(2*3))[3][[1]][[1]] 
`(` 
> quote(1+(2*3))[3][[1]][[2]] 
2 * 3 
> quote(1+(2*3))[3][[1]][[2]][[1]] 
`*` 
> quote(1+(2*3))[3][[1]][[2]][1] 
`*`() 
> `+`(1, `*`(2, 3)) 
[1] 7 

E si può recuperare la notazione infissa:

> quote(`+`(1, `*`(2, 3)))[c(1,2,3)] 
1 + 2 * 3 

> z <- quote(`+`(1, `*`(2, 3))) 
> z[1:length(z)] 
1 + 2 * 3 
16

Ovviamente questo è specifico per R, ma molti altri linguaggi di programmazione lo utilizzano anche. Il termine corretto è in realtà Notazione polacca ed è nato come un modo per determinare senza ambiguità l'ordine senza la necessità di parentesi, che è utile per i parser/interpreti.

Ci sono alcune buone informazioni here se vuoi saperne di più.

+4

Non è una notazione veramente polacca quando ci sono ancora parentesi che delimitano gli elenchi di argomenti per ciascuna funzione. –

+0

@HenningMakholm OK, notazione polacca modificata. Le parentesi sono specifiche per R e la sintassi delle sue funzioni in realtà, è comunque la stessa idea di base e molto pertinente alla domanda che penso. – Trent

Problemi correlati