R sapply函数参数中的循环

R sapply函数参数中的循环,r,sapply,R,Sapply,我试图使用sapply将从列表中传递的名称作为情节标题添加到一系列箱线图中,但遇到了麻烦 首先生成玩具数据来说明问题 set.seed(12345) df <- data.frame(v = rep(letters[1:3], times = 4)) for (i in 1:21) { x <- rnorm(12, 3, 1) df <- cbind(df, x) } colnames (df)<- c("group", paste

我试图使用sapply将从列表中传递的名称作为情节标题添加到一系列箱线图中,但遇到了麻烦

首先生成玩具数据来说明问题

set.seed(12345)

df <- data.frame(v = rep(letters[1:3], times = 4))

for (i in 1:21) { 
     x <- rnorm(12, 3, 1) 
     df <- cbind(df, x)
     }

colnames (df)<- c("group", paste(rep(letters[1:7], each = 3), rep(1:3,  times = 7), sep = ""))
箱线图可以工作,但每个箱线图的标题包含所有三个列名,而不是相应的列名。在仍然使用sapply的情况下,我将如何做到这一点

我很欢迎关于如何更好地完成整个过程的建议,但我主要希望得到一些关于如何解决我的特定问题的建议:在sapply循环中加入另一个循环(即,这更多地是为了让我了解apply系列,而不是如何绘制图表)。

您可以使用

sapply(seq(lengths(colsList)[[1]]), function(x) 
  boxplotFunct(df[,colsList[[1]][x] ], df$group, colsList[[1]][x]))

i、 e.使用索引

当迭代
colsList[[1]]
而不是
df[,colsList[[1]]]]
时,您的
sapply
代码可以大大减少

sapply(colsList[[1]], function(x) {
  boxplotFunct(df[, x], df$group, x)
})


更新:

作为对以下评论的回应,我们假设您希望用另一个列表中的字符串替换现有的图形标题。我倾向于使用
foreach
执行类似于
sapply
的任务,但允许您指定多个输入列表。如果您还不熟悉该软件包,请查看。下面是一些示例代码

## alternate column names
colsList2 <- list(hCols <- paste("h", 1:3, sep = ""),
                  iCols <- paste("i", 1:3, sep = ""),
                  jCols <- paste("j", 1:3, sep = ""),
                  kCols <- paste("k", 1:3, sep = ""),
                  lCols <- paste("l", 1:3, sep = ""),
                  mCols <- paste("m", 1:3, sep = ""),
                  nCols <- paste("n", 1:3, sep = ""))

## create plots
par(mfrow = c(1, 3))

library(foreach)
foreach(x = colsList[[1]], y = colsList2[[1]]) %do%
  boxplotFunct(df[, x], df$group, y)
##备用列名

colsList2是的。完美的谢谢@lukeA。我想你不能帮我解构它吗?我想我得到了x索引,但我不明白你对第一个参数做了什么(即'seq'和'length'提供什么函数?)<代码>长度(colsList)
提供一个向量,其中包含列表中每个向量的长度(它们都是长度3)
length(colsList)[1]
length(colsList[[1]])
提供列表中第一个向量的长度。和
seq(3)
seq_len(3)
生成从1到3的整数序列。你也可以用多种方法来实现你的目标。另外请注意,
?长度
等为您提供了函数方面的帮助。谢谢。我不知道长度。谢谢@fdetsch。非常优雅。这实际上是最具启发性的。如果我想用不同于列名的名称来标记图形,并且我想从第二个列表中调用这些列名,该怎么办?为了便于讨论,假设标签的模式与colsList相同,但从h到n运行。@llewmills,我更新了上面的代码以响应您的最新评论。太棒了!多谢各位@fdetsch@llewmills,那么您可能应该接受答案以表示问题已结束;-)
sapply(seq(lengths(colsList)[[1]]), function(x) 
  boxplotFunct(df[,colsList[[1]][x] ], df$group, colsList[[1]][x]))
sapply(colsList[[1]], function(x) {
  boxplotFunct(df[, x], df$group, x)
})
## alternate column names
colsList2 <- list(hCols <- paste("h", 1:3, sep = ""),
                  iCols <- paste("i", 1:3, sep = ""),
                  jCols <- paste("j", 1:3, sep = ""),
                  kCols <- paste("k", 1:3, sep = ""),
                  lCols <- paste("l", 1:3, sep = ""),
                  mCols <- paste("m", 1:3, sep = ""),
                  nCols <- paste("n", 1:3, sep = ""))

## create plots
par(mfrow = c(1, 3))

library(foreach)
foreach(x = colsList[[1]], y = colsList2[[1]]) %do%
  boxplotFunct(df[, x], df$group, y)