2015-02-12 9 views
6

Wenn ich schreibeWie behandelt R Unicode/UTF-8?

`Δ` <- function(a,b) (a-b)/a 

dann kann ich U+394 umfassen, so lange es in Backticks umschlossen ist. (Im Gegensatz dazu schlägt Δ <- function(a,b) (a-b)/a mit unexpected input in "�" fehl.) Also analysiert R scheinbar UTF-8 oder Unicode oder etwas ähnliches. Die Zuordnung geht gut und auch die Auswertung von zB

`Δ`(1:5, 9:13) 

. Und ich kann auch Δ(1:5, 9:13) auswerten.

Schließlich, wenn ich so etwas wie winsorise <- function(x, λ=.05) { ... } definierte dann λ (U+3bb) nicht braucht R mit einem Graviszeichen werden „um eingeführt“. Ich kann dann winsorise(data, .1) ohne Probleme anrufen.


Die einzige mention in der Dokumentation R I von Unicode ist über dem Kopf finden. Könnte jemand, der es versteht, es mir besser erklären - was passiert "unter der Haube", wenn R ` benötigt, um die Zuordnung zu ♔ zu verstehen, aber parsen kann a (a, b, c) einmal zugewiesen?

+0

In den R-Interna: Was R Benutzer denken, dass Variablen oder Objekte Symbole sind, die an einen Wert gebunden sind. Ich denke, der CHARSXP-Abschnitt, den Sie verknüpft haben, ist der Wert, und Sie sind tatsächlich an den Regeln für Symbole interessiert. Das heißt, ich habe an R-Code in Chinesisch geschrieben, so würde ich Delta erwarten zu arbeiten. –

+1

Welche Version von R verwenden Sie/welches OS/welches Gebietsschema? Ich bekomme "Fehler: \ uxxxx Sequenzen nicht unterstützt in Backticks (Zeile 1)" bei der Zuweisung einer Funktion zu "Δ" (Getestet auf dem heutigen R-devel und 3.1.0 unter Win 7, Englisch UK locale.) –

+0

Welche Version von R benutzen Sie die 'Δ <- Funktion (a, b) (ab)/a 'versagt? Und wenn du sagst es "versagt", was meinst du? Erhalten Sie einen Syntaxfehler? Wenn für mich auf 'R-Version gearbeitet 3.1.0, x86_64-Apfel-darwin10.8.0 (64-Bit)' locale en_US.UTF-8 – MrFlick

Antwort

1

Für die Aufzeichnung unter R-devel (2015.02.11 r67792), Win 7, English UK locale, ich sehe:

options(encoding = "UTF-8") 

`Δ` <- function(a,b) (a-b)/a 
## Error: \uxxxx sequences not supported inside backticks (line 1) 

Δ <- function(a,b) (a-b)/a 
## Error: unexpected input in "\" 

"Δ" <- function(a,b) (a-b)/a  # OK 

`Δ`(1:5, 9:13) 
## Error: \uxxxx sequences not supported inside backticks (line 1) 

Δ(1:5, 9:13) 
## Error: unexpected input in "\" 

"Δ"(1:5, 9:13) 
## Error: could not find function "Δ" 
+0

OK interessant. Ich hätte nicht erwartet, dass sich das in den Versionen unterscheidet. – isomorphismes

4

ich nicht sprechen kann, was unter der Haube vor sich geht die Funktion in Bezug auf Anrufe vs. Funktionsargumente, aber this email from Prof. Ripley aus dem Jahr 2008 kann etwas Licht (Auszug unten) vergossen:

R passes around, prints and plots UTF-8 character data pretty well, but it translates to the native encoding for almost all character-level manipulations (and not just on Windows). ?Encoding spells out the exceptions [...]

Der Grund R ist diese Übersetzung (unter Windows zumindest) in the documentation that the OP linked to erwähnt:

Die R-Dokumentation für ?Quotes erklärt, wie man manchmal sowieso out-of-locale Zeichen verwendet werden können (Hervorhebung hinzugefügt):

Identifiers consist of a sequence of letters, digits, the period (.) and the underscore. They must not start with a digit nor underscore, nor with a period followed by a digit. Reserved words are not valid identifiers.

The definition of a letter depends on the current locale, but only ASCII digits are considered to be digits.

Such identifiers are also known as syntactic names and may be used directly in R code. Almost always, other names can be used provided they are quoted. The preferred quote is the backtick (`), and deparse will normally use it, but under many circumstances single or double quotes can be used (as a character constant will often be converted to a name). One place where backticks may be essential is to delimit variable names in formulae: see formula.

Es gibt eine andere Art und Weise auf solche Zeichen zu bekommen, die den Unicode verwendet Escape-Sequenz (wie \u0394 für Δ). Dies ist normalerweise eine schlechte Idee, wenn Sie dieses Zeichen für etwas anderes als Text auf einem Plot verwenden (dh tun Sie dies nicht für Variablen- oder Funktionsnamen; siehe dieses Zitat von the R 2.7 release notes, wenn ein Großteil des aktuellen UTF-8 Unterstützung hinzugefügt wurde):

If a string presented to the parser contains a \uxxxx escape invalid in the current locale, the string is recorded in UTF-8 with the encoding declared. This is likely to throw an error if it is used later in the session, but it can be printed, and used for e.g. plotting on the windows() device. So "\u03b2" gives a Greek small beta and "\u2642" a 'male sign'. Such strings will be printed as e.g. <U+2642> except in the Rgui console (see below).

ich denke, das die meisten Ihrer Fragen befasst, obwohl ich weiß nicht, warum es einen Unterschied zwischen den Funktionsnamen und Funktionsargument Beispiele, die Sie gab; hoffentlich kann jemand, der besser darüber informiert ist, darauf einspielen. FYI, auf Linux alle diese verschiedenen Möglichkeiten der Zuordnung und eine Funktion Arbeit ohne Fehler aufrufen (weil das Systemgebietsschema UTF-8 ist, so braucht keine Übersetzung auftreten):

Δ <- function(a,b) (a-b)/a   # no error 
`Δ` <- function(a,b) (a-b)/a  # no error 
"Δ" <- function(a,b) (a-b)/a  # no error 
"\u0394" <- function(a,b) (a-b)/a # no error 
Δ(1:5, 9:13)  # -8.00 -4.00 -2.67 -2.00 -1.60 
`Δ`(1:5, 9:13)  # same 
"Δ"(1:5, 9:13)  # same 
"\u0394"(1:5, 9:13) # same 

sessionInfo() 

# R version 3.1.2 (2014-10-31) 
# Platform: x86_64-pc-linux-gnu (64-bit) 

# locale: 
# LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C    LC_TIME=en_US.UTF-8 
# LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8  LC_MESSAGES=en_US.UTF-8 
# LC_PAPER=en_US.UTF-8 LC_NAME=C     LC_ADDRESS=C 
# LC_TELEPHONE=C   LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C 

# attached base packages: 
# stats graphics grDevices utils datasets methods base 
+0

Vielen Dank für all diese Recherchen. Ich hatte keine Ahnung, dass es einen so großen Unterschied zwischen Windows und Linux gibt, was UTF-8 betrifft, aber das erklärt die Leute, die mit Fehlern kommentiert haben. (Und ich bin froh zu wissen, dass es weniger wahrscheinlich ist 32-Bit-Ness als Windows-Ness verursacht ihre Fehler.) – isomorphismes

+0

danke @isomorphismes. Ich habe es gerade etwas bearbeitet, um es kohärenter zu machen, aber die gleichen grundlegenden Informationen sind da. In der Summe: jede Unicode-bezogene Seltsamkeit ist fast immer die Schuld von Windows, aber es hat nichts mit 32 vs 64 Bit zu tun. Es geht um UTF-8 gegen UCS-2 (FYI, wenn Sie weiterlesen, UCS-2 wird auch als "UTF-16LE mit BOM" bekannt). – drammock

+0

@isomorphismes Unter R 3.1.2 (Win 7 64 Bit) 'get (" Δ ") (1,2)' wird ohne Fehler ausgeführt – mnel