我正在尝试从R中相当复杂的数组进行绘制。我想生成一个包含3乘3图形的图像,每个图形上都有红色和蓝色点。
我有一个应用循环的结构,但是我希望每行更改y最大值。
我通常会使用其他语言的计数器,例如i。但R中的应用事情让我感到困惑!
par(mfrow=c(3,3),pty="s") # a 3 by 3 graphic
set.seed(1001)
x <- 1:54 # with 1 to 54 along the x axis
y <- array(rexp(20), dim=c(54,6,3,2)) # and the y axis coming
# from an array with dimensions as shown.
ymax <- c(1,0.1,0.3) # three different y maximum values I want
# on the graphic, one for each row of graphs
counter <- 1 # a counter, starting at 1,
# as I would use in a traditional loop
apply(y[,3:5,,], 2, function(i) # my first apply, which only considers
# the 3rd, 4th and 5th columns
{
yy <- ymax[counter] # using the counter to select my ylimit maximum
apply(i, 2, function (ii) # my second apply, considering the 3rd
# dimension of y
{
plot(x,ii[,1], col="blue", ylim=c(0,yy))
# plotting the 4th dimension
points(x,ii[,2], col="red")
# adding points in a different
# colour from the 4th dim.
})
})
提前感谢您的想法,非常感谢!
干杯 凯特
答案 0 :(得分:8)
我认为在这种情况下使用循环可能更容易。
此外,您的代码没有更新计数器的行,例如counter <- counter + 1
。在apply
内部,您需要使用<<-
分配给全局环境,请注意加倍的较小<
符号。使用lapply
的示例,例如
单lapply
次使用
counter <- 0
lapply(1:3, function(x) {
counter <<- counter + 1
cat("outer", counter, "\n")
plot(1:10, main=counter)
})
或lapply
counter <- 0
lapply(1:3, function(x) {
counter <<- counter + 1
cat("outer", counter, "\n")
lapply(1:3, function(x) {
counter <<- counter + 1
cat("inner", counter, "\n")
plot(1:10, main=counter)
})
})
答案 1 :(得分:7)
这里的关键是在索引上而不是在数组本身上使用lapply,因此您可以使用索引将y限制和内部循环之前的数组子集化。这也避免了必须使用<<-
构造。
稍微简化了您的数据:
par(mfrow=c(3,3),pty="s") # a 3 by 3 graphic
set.seed(1001)
x <- 1:10 # with 1 to 54 along the x axis
dims <- c(10,6,3,2)
y <- array(rexp(prod(dims)), dim=c(10,6,3,2)) # and the y axis coming
ymax <- c(1,0.1,0.3)
lapply(1:3, function(counter, arr) {
apply(
arr[ ,counter + 2, , ], 2,
function(ii) {
plot(x, ii[,1], col="blue", ylim=c(0,ymax[counter]))
points(x, ii[,2], col="red")
} )
},
arr=y
)
答案 2 :(得分:2)
我不打算重写您的代码,因为我必须说它很难理解,但这会有所帮助:您可以使用apply
赋值更新<<-
范围之外的变量,例如更新一些外部的“柜台”