我正在尝试编写一个函数来接受data.frame(x)和a column.该函数对x执行一些计算,然后返回另一个data.frame.我坚持使用最佳实践方法将列名传递给函数.
两个最小的例子fun1和fun2下面产生所需的结果,能够执行操作x$column,使用max(),例如,然而,两者都依赖于看似(至少对我而言)不优雅
substitute()可能eval() fun1 <- function(x, column){
do.call("max", list(substitute(x[a], list(a = column))))
}
fun2 <- function(x, column){
max(eval((substitute(x[a], list(a = column)))))
}
df <- data.frame(B = rnorm(10))
fun1(df, "B")
fun2(df, "B")
Run Code Online (Sandbox Code Playgroud)
我希望能够将该功能称为fun(df, B)例如.我考虑但尚未尝试的其他选项:
column为列号的整数.我认为这会避免substitute().理想情况下,该功能可以接受.with(x, get(column))但是,即使它有效,我认为这仍然需要 substitute formula()和match.call(),我都没有多少经验.子问题:do.call()首选eval()?
鉴于半长的格式ID为变量DF a和b和测定在列中的数据m1和m2.数据类型由变量指定v(值var1和var2).
set.seed(8)
df_l <-
data.frame(
a = rep(sample(LETTERS,5),2),
b = rep(sample(letters,5),2),
v = c(rep("var1",5),rep("var2",5)),
m1 = sample(1:10,10,F),
m2 = sample(20:40,10,F))
Run Code Online (Sandbox Code Playgroud)
看起来像:
a b v m1 m2
1 W r var1 3 40
2 N l var1 6 32
3 R a var1 9 28
4 F g var1 5 21
5 E u var1 4 38
6 W r var2 1 35
7 N l var2 8 33
8 R …Run Code Online (Sandbox Code Playgroud)