就像有问题一样:如何摆脱数据框中的名称deparse(substitute())
?
例如,创建一个简单的函数:
foo<-function(x){
print(
paste(
'This is called', deparse(substitute(x))
)
)
}
向其馈送矢量可提供所需的行为:
test<-1:3
foo(test)
[1] "This is called test"
但是,当我传递数据框的列时,它包括数据框名称:
> df<-data.frame(ones=c(1,1,1), twos=c(2,2,2))
> foo(df$ones)
[1] "This is called df$ones"
如何df$
在输出中摆脱这种情况"This is called ones"
(希望不使用正则表达式)?
这样做的方法似乎不是将其放入函数中,而是使用在问题中出现的函数:
with(df, foo(ones))
当然,可以修改该函数以删除不超过$的所有内容,但是还有其他指定方法,例如DF[["ones"]]
,这一行对其进行修复似乎陷入了寻找必须修复的新情况的无穷无尽的漏洞。
# not recommended
foo2 <- function(x) {
Name <- sub(".*\\$", "", deparse(substitute(x)))
print( paste('This is called', Name) )
}
DF <- data.frame(ones = 5:6)
foo2(DF$ones)
## [1] "This is called ones"
真正的问题是的设计foo
。lm
涉及列名和数据帧的函数使用将它们分开的调用:
foo3 <- function(x, data = parent.frame()) {
Name <- deparse(substitute(x))
print( paste('This is called', Name ))
data[[Name]]
}
ones <- 3:4
foo3(ones)
## [1] "This is called ones"
## [1] 3 4
DF <- data.frame(ones = 5:6)
foo3(ones, DF)
## [1] "This is called ones"
## [1] 5 6
或者另一种设计是将列指定为公式:
foo4 <- function(formula, data = parent.frame()) {
Name <- all.vars(formula)[1]
print( paste('This is called', Name ))
data[[Name]]
}
DF <- data.frame(ones = 5:6)
foo4(~ ones, DF)
## [1] "This is called ones"
## [1] 5 6
ones <- 4:5
foo4(~ ones)
## [1] "This is called ones"
## [1] 4 5
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句