1

列名の名前を変数として関数に渡したいと思います。具体的には、次のコードが与えられます。

#------------------------------------------
# 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のドキュメントに基づいていますが、機能させることができません。解決策と簡単な説明をいただければ幸いです。

前もって感謝します。

4

2 に答える 2

2

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)))
于 2015-09-23T22:01:29.567 に答える