【发布时间】:2015-05-20 17:37:09
【问题描述】:
我已经研究过这个案例 Quantmod: Error loading symbols from MySQL DB 并且已经尝试修复 R
中的 getSymbols.MySQL 函数但是,我发现我的数据库只包含 日期、开盘价、最高价、最低价、收盘价、成交量(没有 close.adj 列)。 那么,如果我想进一步修改getSymbols.MySQL函数,该怎么办呢?
我尝试使用'fix(getSymbols.MySQL)' 来修复该功能。但是,它返回
colnames<-(*tmp*, value = c("H0001.Open", "H0001.High", "H0001.Low", : 'dimnames' [2] 的长度不等于数组范围
当我连接到我的数据库时。
function (Symbols, env, return.class = "xts", db.fields = c("date",
"o", "h", "l", "c", "v", "a"), field.names = NULL, user = NULL,
password = NULL, dbname = NULL, host = "localhost", port = 3306,
...)
{
importDefaults("getSymbols.MySQL")
this.env <- environment()
for (var in names(list(...))) {
assign(var, list(...)[[var]], this.env)
}
if (!hasArg(verbose))
verbose <- FALSE
if (!hasArg(auto.assign))
auto.assign <- TRUE
if (!requireNamespace("DBI", quietly = TRUE))
stop("package:", dQuote("DBI"), "cannot be loaded.")
if (!requireNamespace("RMySQL", quietly = TRUE))
stop("package:", dQuote("RMySQL"), "cannot be loaded.")
if (is.null(user) || is.null(password) || is.null(dbname)) {
stop(paste("At least one connection argument (", sQuote("user"),
sQuote("password"), sQuote("dbname"), ") is not set"))
}
con <- DBI::dbConnect("MySQL", user = user, password = password,
dbname = dbname, host = host, port = port)
db.Symbols <- DBI::dbListTables(con)
if (length(Symbols) != sum(Symbols %in% db.Symbols)) {
missing.db.symbol <- Symbols[!Symbols %in% db.Symbols]
warning(paste("could not load symbol(s): ", paste(missing.db.symbol,
collapse = ", ")))
Symbols <- Symbols[Symbols %in% db.Symbols]
}
for (i in 1:length(Symbols)) {
if (verbose) {
cat(paste("Loading ", Symbols[[i]], paste(rep(".",
10 - nchar(Symbols[[i]])), collapse = ""), sep = ""))
}
query <- paste("SELECT ", paste(db.fields, collapse = ","),
" FROM ", Symbols[[i]], " ORDER BY date")
rs <- DBI::dbSendQuery(con, query)
fr <- DBI::fetch(rs, n = -1)
fr <- xts(as.matrix(fr[, -1]), order.by = as.Date(fr[,
1], origin = "1970-01-01"), src = dbname, updated = Sys.time())
colnames(fr) <- paste(Symbols[[i]], c("Open", "High",
"Low", "Close", "Volume", "Adjusted"), sep = ".")
fr <- convert.time.series(fr = fr, return.class = return.class)
if (auto.assign)
assign(Symbols[[i]], fr, env)
if (verbose)
cat("done\n")
}
DBI::dbDisconnect(con)
if (auto.assign)
return(Symbols)
return(fr)
}
我认为问题在于该函数旨在读取 7 列数据而不是 6 列数据。希望有人能帮忙。
【问题讨论】:
-
为什么设置
db.fields不起作用?并牢记?getSymbols.MySQL中的 Note 部分。 -
getSymbols.MySQL("H0001", env, return.class= 'xts', db.fields = c("date", "open", "high", "low", "close ", "volume"), user = 'xxxx', password = 'xxxx', host='xxxx', dbname = 'xxxx'), 它不起作用。
-
错误
colnames<-(*tmp*, value = c("H0001.Open", "H0001.High", "H0001.Low", : 'dimnames' [2] 的长度不是等于数组范围colnames<-(*tmp*, value = c("H0001.Open", "H0001.High", "H0001.Low", "H0001.Close", "H0001.Volume", "H0001.Adjusted ")) ...