2010-12-11 8 views
1

Der folgende Code gibt eine Zeichenfolge namens "GLD" zurück.Wie nimmst du einen String und dann einen Datenrahmen mit name = dieser String?

CatItUp <- function(x){ 
    print(x) 
} 

CatItUp("GLD") 

Dieser Code gibt das Ende der GLD-Preise zurück. Aber offensichtlich, weil ich GLD in die Funktion hart-codiert habe.

IAmMoney <- function(x) { 

    require("quantmod") 

    getSymbols("GLD") 

    tail(GLD) 

} 

IAmMoney("GLD") 

zurückkehren Diese Preise nicht wie der hartcodierte Version, aber die „GLD“ string wie die CatItUp() Beispiel oben. Ich weiß nicht warum.

IAmMoney <- function(x) { 

    require("quantmod") 

    getSymbols("x") 

    tail(x) 

} 

IAmMoney("GLD") 

Wie können Sie passieren 'GLD' zum quantmod :: getSymbols Funktion innerhalb der IAmMoney() Funktion?

+0

Ich nahm mir die Freiheit zu versuchen, die Frage umzubenennen, um den Kern Ihres Problems widerzuspiegeln. Ich bin mir nicht sicher, ob ich geholfen oder behindert habe. –

+0

danke, es half – Milktrader

Antwort

1

Sind Sie nicht einfach übersehen, dass getSymbols() eine Option auto.assign hat?

So können Sie diese stattdessen wollen:

R> library(quantmod) 
R> silly <- function(sym) { 
+  x <- getSymbols(sym, auto.assign=FALSE) 
+  tail(x) 
+ } 
R> silly("IBM") 
      IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted 
2010-12-03 144.25 145.68 144.25 145.38 3710600  145.38 
2010-12-06 144.54 145.87 144.52 144.99 3321800  144.99 
2010-12-07 146.02 146.30 143.87 144.02 4828600  144.02 
2010-12-08 144.35 145.65 143.84 144.98 4961400  144.98 
2010-12-09 145.94 145.94 143.52 144.30 4405300  144.30 
2010-12-10 144.88 144.95 143.73 144.82 3503800  144.82 
R> silly("C") 
      C.Open C.High C.Low C.Close C.Volume C.Adjusted 
2010-12-03 4.38 4.46 4.35 4.45 360277300  4.45 
2010-12-06 4.45 4.50 4.43 4.45 445170000  4.45 
2010-12-07 4.55 4.65 4.54 4.62 3265796000  4.62 
2010-12-08 4.61 4.64 4.55 4.64 913820900  4.64 
2010-12-09 4.68 4.71 4.64 4.69 731119000  4.69 
2010-12-10 4.70 4.77 4.66 4.77 763156100  4.77 
R> 

getSymbols() Standardverhalten von „Ich werde es in Ihrer Umgebung als neue Variable Stick“ ist mehr oder weniger ein Konstruktionsfehler und, wie ich mich erinnere, anerkannt als eine solche.

Und daher kann das Verhalten von auto.assign geändert werden.

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Das hatte ich in der Dokumentation total übersehen. Also könnte man einfach 'tail '(getSymbols (" GLD ", auto.assign = FALSE))' Nifty. Danke für die Klarstellung. –

+0

Dies ist perfekt für das Quantmod-Paket. Einfach und sauber. – Milktrader

1

Es ist schwierig, da quantmod einen Datenrahmen erstellt, dessen Name der gleiche ist wie die Zeichenfolge, die Sie x zuweisen. Zuerst benötigen Sie einen String-Wert, später rufen Sie einen Datenrahmen mit dem Namen x auf. Genau dafür ist do.call() hilfreich.

IAmMoney <- function(x) { 
    require("quantmod") 
    getSymbols(x) 
    tail(get(x)) 
    # changed to get(x) per Ahala's input below. 
    # if you had many params you were passing, do.call() 
    # might make more sense 
} 

IAmMoney("GLD") 

Dirk wies darauf hin, dass die Verwendung des auto.assign=FALSE Argument, das bedeutet, dass Sie einfach diese stattdessen tun können:

tail(getSymbols("GLD", auto.assign=FALSE))

+0

Schön. Es klappt. Ich muss diese kompakte kleine Codezeile verstehen. – Milktrader

+0

do.call() nahm mich eine Weile, um auch voll zu schätzen. –

+0

also akzeptiert getSymbols die Zeichenfolge und erstellt das GLD-Objekt? Und um 'GLD' wieder als einfache Zeichenfolge und nicht als Datenrahmen zu verwenden, zwingen Sie es zurück zu einem Namen? Und warum Liste? – Milktrader

3

Will tail(get(x)) Arbeit?

+1

+1; "Get" würde hier das geeignetste Werkzeug sein. –

+0

Danke Ahala. In meinem Hinterkopf dachte ich, dass es "A Better Way" geben muss. –

+0

Danke, dies wird in Zukunft für Nicht-Quantum-Funktionen nützlich sein. – Milktrader

Verwandte Themen