如何在R中的函数调用中包含变量名?

时间:2010-02-23 08:17:54

标签: r

我正在尝试更改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)))
}

4 个答案:

答案 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(..)。