【问题标题】:How can I include a variable name in a function call in R?如何在 R 的函数调用中包含变量名?
【发布时间】:2010-02-23 08:17:54
【问题描述】:

我正在尝试更改包含在 for 循环和函数调用中的变量的名称。在下面的示例中,我希望将 column_1 传递给绘图函数,然后将 column_2 等传递给我。我尝试使用 do.call,但它返回“找不到对象'column_j'”。但是对象 column_j 在那里,如果我将它们硬编码进去,绘图功能就可以工作。非常感谢帮助。

for (j in 2:12) {
    column_to_plot = paste("column_", j, sep = "")
    do.call("plot", list(x, as.name(column_to_plot)))
}

【问题讨论】:

    标签: r


    【解决方案1】:

    我愿意:

    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 生成向量,但我想提供清晰的示例)

    【讨论】:

    • 我也无法重现原发帖者的问题。
    【解决方案2】:

    您可以在 for 循环中不使用 paste() 命令来执行此操作。只需通过循环中的函数colnames() 分配列:

    column_to_plot <- colnames(dataframeNAME)[j]
    

    希望能帮上忙。

    【讨论】:

      【解决方案3】:

      您是否尝试通过字符串检索工作区中的对象?在这种情况下, parse() 可能会有所帮助:

      for (j in 2:12) {
          column_to_plot = paste("column_", j, sep = "")
          plot(x, eval(parse(text=column_to_plot)))
      }
      

      在这种情况下,您可以使用 do.call(),但它不是必需的。

      编辑:在 eval() 中包装 parse()

      【讨论】:

      • 斯蒂芬,谢谢,我对解析函数很好奇,所以我尝试了你的例子,但它对我不起作用。我还尝试使用 parse(text=column_to_plot)[[1]]) 来获取我想要绘制的元素,但它说“x”和“y”长度不同。但是, plot(x, column_2) 在这种情况下有效。
      • 啊,对不起!请参阅上面的编辑...(在 eval() 中包装对 parse() 的调用)
      【解决方案4】:

      这是一种方法:

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

      【讨论】:

        猜你喜欢
        • 2014-09-30
        • 2022-01-15
        • 2017-08-20
        • 2019-08-31
        • 2015-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-03
        相关资源
        最近更新 更多