Comment prenez-vous une chaîne, puis appeler une trame de données avec le nom = cette chaîne?
Question
Le code suivant retourne une chaîne appelée "GLD".
CatItUp <- function(x){
print(x)
}
CatItUp("GLD")
Ce code renvoie la queue des prix GLD. Mais évidemment, parce que j'ai GLD codé en dur dans la fonction.
IAmMoney <- function(x) {
require("quantmod")
getSymbols("GLD")
tail(GLD)
}
IAmMoney("GLD")
Cela ne retourne pas les prix comme la version codée en dur, mais l'exemple chaîne « GLD » comme le CatItUp () ci-dessus. Je ne sais pas pourquoi.
IAmMoney <- function(x) {
require("quantmod")
getSymbols("x")
tail(x)
}
IAmMoney("GLD")
Comment pouvez-vous passer 'GLD' à la fonction quantmod :: getSymbols, dans la fonction IAmMoney ()?
La solution
N'êtes-vous pas simplement oublier que getSymbols()
a une auto.assign
option?
Vous pouvez ceci:
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>
comportement par défaut de getSymbols()
de « Je vais le coller dans votre environnement comme une nouvelle variable » est plus ou moins un défaut de conception et, si je me souviens, reconnu comme tel.
Et par conséquent, le comportement peut être modifié par auto.assign
.
Autres conseils
Will travail tail(get(x))
?
Il est délicat car quantmod crée une trame de données qui est le nom est le même que la chaîne que vous attribuez à x. Donc, au début, vous avez besoin d'une valeur de chaîne, puis plus tard, vous appelez une trame de données par le nom de x. Ceci est exactement ce que do.call () est utile pour.
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 a souligné que l'utilisation de l'argument auto.assign=FALSE
qui signifie que vous pouvez simplement faire ceci:
tail(getSymbols("GLD", auto.assign=FALSE))