Blogul lui Zhenguo Zhang /2026/04/26/single-vs-double-quotes-in-command-line-and-r/ –
Când alimentați un program cu argumente de linie de comandă, ghilimele simple și ghilimele duble fac o diferență semnificativă.
Regula Shell
ghilimele simple (') nu permit evadarea niciunui caracter; conținutul este tratat literal. ghilimele duble ("), totuși, permit evadarea caracterelor și extinderea variabilă.
Puteți testa acest lucru folosind printf comandă, care imprimă fiecare argument pe care îl primește pe o linie nouă:
1 2 3 4 5 6 7 |
# Using single quotes: the backslash is literal printf "%sn" '+hello' # Output: +hello # Using double quotes: the shell escapes the double backslash printf "%sn" "\+hello" # Output: +hello |
După cum puteți vedea, ambele comenzi au ca rezultat același șir +hello fiind trecut la program. Primul este citit exact așa cum este scris, în timp ce în cel din urmă, shell-ul interpretează backslash dublu ca o singură backslash literal înainte de a o transmite.
Regula R Console
În R, când lucrezi direct în consola R, tu trebuie să se ocupe de sintaxa literală a șirului propriu a limbii.
Majoritatea limbajelor de programare, inclusiv R, folosesc backslash () ca personaj de evadare. Deci, când îl tastați, va fi explicat imediat ca un caracter de evadare. Dacă tastezi "." în consola R, va fi interpretat mai întâi în consolă înainte de a fi transmis către R însuși; interpretul vă va spune probabil că nu există o astfel de secvență de evadare ca .și de fapt nu va pune o bară oblică inversă în șirul rezultat.
Pentru a plasa o bară oblică inversă într-un șir în R, trebuie să utilizați o bară oblică inversă dublă (\). Acest lucru îi spune lui R că nu doriți ca a doua bară oblică inversă să fie un caracter de escape atunci când introduceți text în consolăci mai degrabă doriți ca un singur caracter bară oblică inversă din șir să fie transmis către R.
De exemplu, atunci când definiți o expresie regulată:
1 |
myregexp = "^planet\.name$" |
Aceasta creează un șir care conține textul ^planet.name$ (observați singura bară oblică inversă). Acest șir este apoi transmis unei funcții regex, care interpretează . secvența ca „un punct literal”, mai degrabă decât caracterul joker regex pentru „orice caracter”.
Această regulă se aplică și scenariului în care tastați caracterele care evadează în scripturile R.
Pentru mai multă profunzime, consultați această discuție Reddit despre barele oblice în regex.
Argumente de linie de comandă pentru scripturile R
Esențial, dacă rulați un script R și îi furnizați parametrii din linia de comandă (de exemplu, prin Rscript), cele de mai sus regula cochiliei se aplică în locul regulilor interne ale consolei R pentru acele argumente inițiale.
Pentru a vedea acest lucru în acțiune, creați un fișier numit test_args.R:
1 2 3 4 5 |
# test_args.R
args <- commandArgs(trailingOnly = TRUE)
if (length(args) > 0) {
cat("Argument received by R:", args(1), "n")
}
|
Acum rulați-l de pe terminalul dvs.:
1 2 3 4 5 6 7 |
# Test with single quotes Rscript test_args.R '+hello' # Output: Argument received by R: +hello # Test with double quotes Rscript test_args.R "\+hello" # Output: Argument received by R: +hello |
Dacă doriți să introduceți o expresie regulată într-un script R prin linia de comandă pentru a fi utilizată într-o funcție ca sub()ar trebui să utilizați aceste reguli de citare shell. Coarda +hello primit de R se va potrivi corect cu șirul literal +hello în codul dvs. R.
– /2026/04/26/single-vs-double-quotes-in-command-line-and-r/ –
