用R中的字符串值替换变量
Replace variable with a string value in R
我想将列名的名称作为变量传递给函数。
具体来说,给出以下代码:
#------------------------------------------
# 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 中的文档,但我无法使其工作。解决方案和简短的解释将不胜感激。
提前致谢。
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))))
但 Richard 在他的评论中有一个观点:您可以通过先 cbind
ing,然后分配名称来简化它:
b_func <- function (my_dt1, my_dt2, my_col)
setNames(cbind(as.Date("2015-09-21") + 0:4, DF2), c(my_col, colnames(DF2)))
我很困惑,因为你函数的两个参数 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
}
我想将列名的名称作为变量传递给函数。 具体来说,给出以下代码:
#------------------------------------------
# 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 中的文档,但我无法使其工作。解决方案和简短的解释将不胜感激。
提前致谢。
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))))
但 Richard 在他的评论中有一个观点:您可以通过先 cbind
ing,然后分配名称来简化它:
b_func <- function (my_dt1, my_dt2, my_col)
setNames(cbind(as.Date("2015-09-21") + 0:4, DF2), c(my_col, colnames(DF2)))
我很困惑,因为你函数的两个参数 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
}