【问题标题】:Replace variable with a string value in R [duplicate]用R中的字符串值替换变量[重复]
【发布时间】:2015-12-21 09:27:51
【问题描述】:

我想将列名的名称作为变量传递给函数。 具体来说,给定以下代码:

#------------------------------------------
# Create mock data
#------------------------------------------

DF1 = data.frame(colA = as.Date("2015-09-21") + 0:4, B = 1:5, C = 5:1)
DF2 = data.frame(B = 1:5, C = 5:1)

#------------------------------------------
# Sample function call
#------------------------------------------

colname <- "colA"

b_func <- function( my_dt1, my_dt2, my_col ) {    
  return( eval(substitute( cbind( variable = as.Date("2015-09-21") + 0:4, DF2 ), 
    list(variable = as.name(my_col)))) )
}

b_func( DF1, DF2, colname )

我希望得到以下输出:

        colA B C
1 2015-09-21 1 5
2 2015-09-22 2 4
3 2015-09-23 3 3
4 2015-09-24 4 2
5 2015-09-25 5 1

相反,我得到以下输出,而不是"colA",我得到的是"variable"

    variable B C
1 2015-09-21 1 5
2 2015-09-22 2 4
3 2015-09-23 3 3
4 2015-09-24 4 2
5 2015-09-25 5 1

进一步挖掘我发现:

colname <- "colA"
substitute( cbind( variable = as.Date("2015-09-21") + 0:4, DF2 ), list(variable = as.name(colname)))
# returns:  cbind(variable = as.Date("2015-09-21") + 0:4, DF2)
# expected: cbind(colA = as.Date("2015-09-21") + 0:4, DF2)

此示例基于R FAQ 中的文档,但我无法使其工作。一个解决方案和简短的解释将不胜感激。

提前致谢。

【问题讨论】:

  • setNames() 会更安全(在cbind() 之后)
  • 谢谢理查德。很好的建议。

标签: r metaprogramming nse


【解决方案1】:

substitute 不替换参数名称,它们不是变量。

您可以改用do.call

b_func <- function (my_dt1, my_dt2, my_col)
    do.call(cbind, setNames(c(list(as.Date("2015-09-21") + 0:4), DF2),
                            c(my_col, colnames(DF2))))

但理查德在他的评论中有一点:您可以通过先cbinding 来简化这一点,然后再分配名称:

b_func <- function (my_dt1, my_dt2, my_col)
    setNames(cbind(as.Date("2015-09-21") + 0:4, DF2), c(my_col, colnames(DF2)))

【讨论】:

    【解决方案2】:

    我很困惑,您的函数的两个参数 my_dt1 和 my_dt2 似乎没有被使用。您似乎正在做的只是向 DF2 添加一列?如果是这样,请这样做:

    b_func = function(my_dt, my_col) {
      my_dt[[my_col]] = as.Date("2015-09-21") + 0:4
      my_dt
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2023-03-30
      • 2020-03-22
      • 2016-09-13
      • 2022-01-03
      • 2020-08-14
      相关资源
      最近更新 更多