我正在尝试更改for循环和函数调用中包含的变量的名称。在下面的例子中,我想将column_1传递给plot函数,然后是column_2等。我尝试过使用do.call,但它返回“object'column_j'not found”。但是对象column_j就在那里,如果我对它们进行硬编码,则绘图功能会起作用。非常感谢。
for (j in 2:12) {
column_to_plot = paste("column_", j, sep = "")
do.call("plot", list(x, as.name(column_to_plot)))
}
答案 0 :(得分:6)
我做:
x <- runif(100)
column_2 <-
column_3 <-
column_4 <-
column_5 <-
column_6 <-
column_7 <-
column_8 <-
column_9 <-
column_10 <-
column_11 <-
column_12 <- rnorm(100)
for (j in 2:12) {
column_to_plot = paste("column_", j, sep = "")
do.call("plot", list(x, as.name(column_to_plot)))
}
我没有错误。也许你可以提供(根据你的问题)工作的硬代码,然后更容易找到错误的原因。
(我知道我可以使用循环和assign
生成向量,但我想提供明确的示例)
答案 1 :(得分:2)
您可以在paste()
循环中没有for
命令的情况下执行此操作。只需通过循环中的函数colnames()
分配列:
column_to_plot <- colnames(dataframeNAME)[j]
希望这有助于作为第一个kludge。
答案 2 :(得分:2)
您是否尝试通过字符串检索工作区中的对象?在这种情况下,parse()可能会有所帮助:
for (j in 2:12) {
column_to_plot = paste("column_", j, sep = "")
plot(x, eval(parse(text=column_to_plot)))
}
在这种情况下,您可以使用do.call(),但不需要它。
编辑:eval()中的wrapp parse()
答案 3 :(得分:1)
这是一种方法:
tmp.df <- data.frame(col_1=rnorm(10),col_2=rnorm(10),col_3=rnorm(10))
x <- seq(2,20,by=2)
plot(x, tmp.df$col_1)
for(j in 2:3){
name.list <- list("x",paste("col_",j,sep=""))
with(tmp.df, do.call("lines",lapply(name.list,as.name))) }
如果你愿意的话,你也可以做colnames(tmp.df)[j]而不是paste(..)。