¿Cómo se toma una cadena y luego llama a una trama de datos con el nombre = esa cadena?
Pregunta
El código siguiente devuelve una cadena denominada "GLD".
CatItUp <- function(x){
print(x)
}
CatItUp("GLD")
Este código devuelve la cola de precios GLD. Pero, obviamente, porque he GLD en forma fija en la función.
IAmMoney <- function(x) {
require("quantmod")
getSymbols("GLD")
tail(GLD)
}
IAmMoney("GLD")
Esto no devuelve los precios al igual que la versión codificada, pero el "GLD" cadena como el ejemplo CatItUp () anterior. No sé por qué.
IAmMoney <- function(x) {
require("quantmod")
getSymbols("x")
tail(x)
}
IAmMoney("GLD")
¿Cómo se puede pasar 'GLD' a la función quantmod :: getSymbols, dentro de la función IAmMoney ()?
Solución
¿No simplemente pasando por alto el hecho de que tiene una getSymbols()
auto.assign
opción?
Así que es posible que desee esto en su lugar:
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()
comportamiento predeterminado de "voy a pegarlo en su entorno como una nueva variable" es más o menos un defecto de diseño y, por lo que recuerdo, reconocido como tal.
Y por lo tanto, el comportamiento puede ser alterado por auto.assign
.
Otros consejos
trabajará tail(get(x))
?
Es difícil porque quantmod crea una trama de datos cuyo nombre es el mismo que la cadena se asigna a x. Así que al principio se necesita un valor de cadena, posteriormente, a la que llama una trama de datos con el nombre de x. Esto es exactamente lo do.call () es útil para.
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 señaló que el uso del argumento auto.assign=FALSE
que significa que puede simplemente hacer esto en su lugar:
tail(getSymbols("GLD", auto.assign=FALSE))