Comment prenez-vous une chaîne, puis appeler une trame de données avec le nom = cette chaîne?

StackOverflow https://stackoverflow.com/questions/4414580

  •  08-10-2019
  •  | 
  •  

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 ()?

Était-ce utile?

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))

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top