我正在编写一个函数,希望能够将数据帧中的变量作为原子向量传递,例如df$var
(例如mtcars$mpg
)。
为使示例非常简单,请说该函数仅返回data.frame(table(df$var))
:
foo.function <- function(var) {
data.frame(table(var))
}
head(foo.function(mtcars$mpg))
#> var Freq
#> 1 10.4 2
#> 2 13.3 1
#> 3 14.3 1
#> 4 14.7 1
#> 5 15 1
#> 6 15.2 2
请注意,返回表中的列表变量的名称是传递对象的内部名称(var
,而不是mpg
的“原始”名称。是否可以从函数内检索mpg
(仅是名称)(无需更改或添加参数)?我倾向于说不,因为R只是接收值的向量,但是我怀疑R可能具有基于NSE的能力。
答案 0 :(得分:4)
我们可以使用deparse/substitute
提取列名
foo.function <- function(var) {
print(sub(".*\\$", "", deparse(substitute(var))))
data.frame(table(var))
}
head(foo.function(mtcars$mpg), 4)
#[1] "mpg"
# var Freq
#1 10.4 2
#2 13.3 1
#3 14.3 1
#4 14.7 1
如果我们需要更改列名
foo.function <- function(var) {
nm1 <- sub(".*\\$", "", deparse(substitute(var)))
out <- data.frame(table(var))
names(out)[1] <- nm1
out
}
head(foo.function(mtcars$mpg), 4)
# mpg Freq
#1 10.4 2
#2 13.3 1
#3 14.3 1
#4 14.7 1
正如@RonakShah在注释中指出的,最好将列名和数据作为单独的参数传递。如果该函数的局限性是仅传递单个参数,并且始终必须使用$
,则上述函数将能够检索列名