【发布时间】:2016-04-25 13:39:21
【问题描述】:
我有以下两个代码sn-ps(区别只是在names位置):
第一:
library(zoo)
vec <- rep(c(rep(5,10), rep(2,10)), 10)
win.size <- c(2, 4, 5, 10, 20, 30)
vec.avgs <- lapply(win.size, function(x) { rollapply(vec, width = x, by = x, FUN = mean, align = "left") })
names(vec.avgs) <- win.size
vec.rep <- lapply(as.character(win.size), function(x) { rep(vec.avgs[[x]], each=x) })
names(vec.rep) <- win.size
res <- lapply(as.character(win.size), function(x) { cor(vec[1:length(vec.rep[[x]])], vec.rep[[x]]) })
第二次:
library(zoo)
vec <- rep(c(rep(5,10), rep(2,10)), 10)
win.size <- c(2, 4, 5, 10, 20, 30)
vec.avgs <- lapply(win.size, function(x) { rollapply(vec, width = x, by = x, FUN = mean, align = "left") })
vec.rep <- lapply(as.character(win.size), function(x) { rep(vec.avgs[[x]], each=x) })
res <- lapply(as.character(win.size), function(x) { cor(vec[1:length(vec.rep[[x]])], vec.rep[[x]]) })
names(vec.avgs) <- win.size
names(vec.rep) <- win.size
1st 工作正常,但 2nd 抛出:
Error in cor(vec[1:length(vec.rep[[x]])], vec.rep[[x]]) :
supply both 'x' and 'y' or a matrix-like 'x'
说到这一行:
res <- lapply(as.character(win.size), function(x) { cor(vec[1:length(vec.rep[[x]])], vec.rep[[x]]) })
错误消息与仅使用一个参数调用 cor 相同,例如:
> cor(vec,)
Error in cor(vec, ) : supply both 'x' and 'y' or a matrix-like 'x'
基于suggestions 关于调试apply 函数,我设置了options(error = browser) 以查看会发生什么。令我惊讶的是函数上下文中没有x 变量,我无法在代码中移动(按n 退出Browse):
> lapply(as.character(win.size), function(x) { cor(vec[1:length(vec.rep[[x]])], vec.rep[[x]]) })
Error in cor(vec[1:length(vec.rep[[x]])], vec.rep[[x]]) :
supply both 'x' and 'y' or a matrix-like 'x'
Called from: stop("supply both 'x' and 'y' or a matrix-like 'x'")
Browse[1]> ls()
[1] "vec" "vec.avgs" "vec.rep" "win.size"
Browse[1]> x
Error during wrapup: object 'x' not found
Browse[1]> n
>
另一个令我惊讶的是,第一个示例在两个lapply 函数中都需要as.character(win.size)。因此,如果我重写 1st 代码而不将 win.size 转换为 characters:
vec <- rep(c(rep(5,10), rep(2,10)), 10)
win.size <- c(2, 4, 5, 10, 20, 30)
vec.avgs <- lapply(win.size, function(x) { rollapply(vec, width = x, by = x, FUN = mean, align = "left") })
names(vec.avgs) <- win.size
vec.rep <- lapply(win.size, function(x) { rep(vec.avgs[[x]], each=x) })
names(vec.rep) <- win.size
res <- lapply(win.size, function(x) { cor(vec[1:length(vec.rep[[x]])], vec.rep[[x]]) })
我得到错误:
Error in vec.avgs[[x]] : subscript out of bounds
Called from: FUN(X[[i]], ...)
当谈到这一行时:
vec.rep <- apply(win.size, function(x) { rep(vec.avgs[[x]], each=x) })
设置 options(error = browser) 并没有再次帮助,因为之前没有 x 变量:
> lapply(win.size, function(x) { rep(vec.avgs[[x]], each=x) })
Error in vec.avgs[[x]] : subscript out of bounds
Called from: FUN(X[[i]], ...)
Browse[1]> ls()
[1] "vec" "vec.avgs" "win.size"
Browse[1]> n
>
问题:
- 为什么 1st 示例有效而 2nd 无效?
-
ls()是否显示函数上下文或整个程序,或者我的x变量在哪里? - 为什么在第一个示例中需要
as.character(win.size)? - 如何调试这些错误以及为什么
n退出Browse模式?
【问题讨论】: