2016-10-20 8 views
5

Ich habe eine Menge Code, der den $ Operator statt [[ verwendet. Ich habe über viele Vorteile von [[ gelesen und möchte den gesamten Code umgestalten.

Würde es Probleme mit der folgenden Methode geben? Und wie könnte ich die Suche am besten mit RStudio oder TextWrangler auf einem Mac durchführen?

l <- list() 
l$`__a` <- data.frame(`__ID` = stringi::stri_rand_strings(10, 1), col = stringi::stri_rand_strings(10, 1), check.names = F) 

Der Code sieht wie folgt nun:

l$`__a`$`__ID` 

Und ich würde es Refactoring mögen:

l[["__a"]][["__ID"]] 

Um dies zu erreichen, sind folgende Ersetzungen ausreichend?

$` to [[" 

` to "]] 

Ich habe einen Bereich in meinem Code, wo diese Methode nicht funktionieren würde, gefunden und jetzt habe ich auch festgestellt, eine Lösung für, wie das Problem zu vermeiden: Avoiding backtick characters with dplyr

df <- dat[["__Table"]] %>% select(`__ID`) %>% mutate(fk_table = "__Table", val = 1) 

Bevor das tun falschen Ersatz des Graviszeichen Ersetzung oben würde ich die select Funktion, dies ändern zu vermeiden müssen:

select_(as.name("__ID")) 

Leider ist das, __ in Spaltennamen können nicht vermieden werden, da die Daten aus einer relationalen Datenbank (FileMaker) heruntergeladen werden und unter Beibehaltung der Spaltennamen in die Datenbank zurückgeschrieben werden müssen.

Referenzen über [[:

Referenzen über in R Refactoring:

+0

Ehrlich gesagt, würde ich mir nicht allzu viel Sorgen machen über das Refactoring Ihres Codes. Sie werden wahrscheinlich mehr Fehler beim Refactoring einführen, als Sie wahrscheinlich erleben werden, wenn Sie es verlassen. Ich habe gerade 20 Minuten damit verbracht, einen Anfang zu machen, und das Beste, was ich mir vorstellen kann, ist, dass ich nicht in der Lage bin, in allen gängigen Fällen zu funktionieren, ganz zu schweigen von den Randfällen. 'Bibliothek (stringr) Test <- c ("x <- df $ var_name \ n", "x <- df $ var_name", "x <- df $ var_name") str_replace (Test, pattern = "([$]) (. +) (\ n | [! \" # $% &() * +, -./:; <=>? @^\ '{|} ~])", replace = " [[\ "\\ 2 \"]] \\ 3 ")' – Benjamin

+1

I second @ Benjamins Kommentar. Behebe nur wichtige Dinge im bestehenden Code und verwende dein neu gefundenes Fav-Idiom, das sich vorwärts bewegt. Dein '$' -gefüllter Code ist nicht falsch und nicht kaputt Gib deine begrenzte Ressource der Zeit für neue und wichtige Dinge aus – hrbrmstr

+0

Danke @Benjamin und @hrbmstr, ich weiß deine Kommentare zu schätzen. Hier ist der Zweck des Refactorings nur ein Teil der Geschichte und nicht nur für die Lesbarkeit des Codes bevorzuge '$' für die Lesbarkeit, obwohl es die Backtick-Symbole hat.Meine Hauptziele sind die Weitergabe von Spaltennamen es als Variablen (auch wenn sie mit '_' beginnen und das ist einfacher mit Standard-Strings, die keine Backtick-Symbole enthalten). Macht das Sinn? Jetzt sind die Teile, die Backticks haben, hart codiert und ich werde sie dynamisch berechnen. – Bobby

Antwort

4

Sie könnten versuchen:

v <- c("l$`__a`$`__ID`") 

library(stringi) 
stri_replace_all_fixed(v, c('$`', '`'), c('[["', '"]]'), vectorize_all = FALSE) 

Welche gibt:

#[1] "l[[\"__a\"]][[\"__ID\"]]" 

Hinweis: Sie die \" in der Ausgabe sehen, weil print() die Anführungszeichen entkommt, wenn schau sie an.Sie können die oben in noquote() wickeln die Ausgabe ohne \"

noquote(
    stri_replace_all_fixed(v, c('$`', '`'), c('[["', '"]]'), vectorize_all = FALSE) 
) 

um zu sehen, das gibt:

#[1] l[["__a"]][["__ID"]] 

Sollten Sie dies auf eine ganze Datei anwenden möchten, könnten Sie versuchen:

writeLines(stri_replace_all_fixed(readLines("script.R"), 
            c('$`', '`'), c('[["', '"]]'), vectorize_all = FALSE), 
      file("new_script.R")) 
+0

Das sieht sehr ermutigend aus. Weißt du, wie man es auf eine ganze .r-Datei anwendet? – Bobby

+0

@Bobby Vielleicht 'stri_replace_all_fixed (readLines (" script.R "), c ('$'', '' '), c ("[['", '']] "), vectorize_all = FALSCH)'? –

+0

Ich denke immer noch, dass dies eine fantastische Antwort für den spezifischen Teil meiner Frage ist. Für den allgemeinen Teil bin ich mir noch nicht sicher. Wie kann ich sicherstellen, dass ich keine Backtick-Symbole habe, die nicht ersetzt werden sollten? – Bobby