Cos'è questo codice: `+`(1, `*`(2, 3))
si suppone stia facendo in R? Può essere codificato in un modo più tipico? Come?Comprensione: `+` (1, `*` (2, 3)) e come codificarlo meglio
risposta
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)
.
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.
Dovrebbe essere "Prima abbiamo' 2 * 3'? " – tospig
Sì, grazie .. –
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
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ù.
Non è una notazione veramente polacca quando ci sono ancora parentesi che delimitano gli elenchi di argomenti per ciascuna funzione. –
@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
- 1. Somma delle serie: 1^1 + 2^2 + 3^3 + ... + n^n (mod m)
- 2. È! 0 e! 1 meglio di 1 e 0?
- 3. Come posso limitare al meglio i risultati di String.compareTo() a -1, 0 e 1?
- 4. 3 Div, 2 a larghezza fissa e 1 fluido
- 5. comprensione dizionario in Python 3
- 6. Qual è la prova di (N-1) + (N-2) + (N-3) + ... + 1 = N * (N-1)/2
- 7. Qual è la differenza tra 3/2 e -3/2?
- 8. comprensione 2^31 e -2^31 intero promozione
- 9. Come assegnare dinamicamente hash con $ 1, $ 2, $ 3
- 10. Divisione dello schermo in 1/3 e 2/3 visualizzazioni utilizzando l'autolayout
- 11. Comprensione codice Scala: (-_._ 2)
- 12. lista.extend e comprensione
- 13. Apprendimento ASP.NET MVC inizia con 1 o 2 o 3
- 14. Perché SELECT 2^3 restituisce 1 in SQL Server?
- 15. Predsort/3 come msort/2
- 16. Perché isinstance ([1, 2, 3], List [str]) è true?
- 17. Jersey 2. *. Come sostituire InjectableProvider e AbstractHttpContextInjectable di Jersey 1. *
- 18. MAX vs Top 1 - che è meglio?
- 19. Flusso colonne CSS 3 (2 fisse, 1 dinamico)
- 20. Selenium 1 vs 2
- 21. Crittografia SSL, SHA-1 e SHA-2
- 22. Come unire 2 colonne su 1 colonna
- 23. Python - Comprensione delle liste con 2 cicli for e un ADD e operando
- 24. Cosa significano ..1 e ..2 in R?
- 25. Regex $ 1, $ 2, ecc.
- 26. Metti le tessere 1 * 2 e 1 * 3 su un piano n * m il maggior numero possibile
- 27. In Javascript, perché [1, 2] == [1, 2] o ({a: 1}) == ({a: 1}) falso?
- 28. aggiornamento angolare 1-2
- 29. Perché le cifre 1, 2 e 3 appaiono così frequentemente usando la funzione C rand()?
- 30. Ritorno 1 ° da 1, 2 ° da 2, ..., 11 da 11,
Quanto interessante. In Haskell usi 'attorno a una funzione per trasformarla in un operatore infisso! –