将 df$var 传递给函数时,是否可以获取 'var' 的名称?
when passing df$var to a function, is it possible to get the name of 'var'?
我正在编写一个函数,希望能够将数据框中的变量作为原子向量传递,例如 df$var
(例如,mtcars$mpg
)。
为使示例非常简单,假设函数只是 returns 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
请注意,返回的 table 中表格变量的名称是传递对象的内部名称 (var
) 而不是它的 "original" 名称,后者是 mpg
。是否可以从函数中检索 mpg
(只是名称)(无需更改或添加参数)?我倾向于说不,因为 R 只是接收一个值向量,但我怀疑 R 可能具有这种能力基于它可以用 NSE.
做什么
我们可以使用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 在评论中指出的那样,最好将列名和数据作为单独的参数传递。如果函数的限制是只传递一个参数并且它总是必须与 $
在一起,那么上面的函数将能够检索列名
我正在编写一个函数,希望能够将数据框中的变量作为原子向量传递,例如 df$var
(例如,mtcars$mpg
)。
为使示例非常简单,假设函数只是 returns 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
请注意,返回的 table 中表格变量的名称是传递对象的内部名称 (var
) 而不是它的 "original" 名称,后者是 mpg
。是否可以从函数中检索 mpg
(只是名称)(无需更改或添加参数)?我倾向于说不,因为 R 只是接收一个值向量,但我怀疑 R 可能具有这种能力基于它可以用 NSE.
我们可以使用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 在评论中指出的那样,最好将列名和数据作为单独的参数传递。如果函数的限制是只传递一个参数并且它总是必须与 $
在一起,那么上面的函数将能够检索列名