gpt4 book ai didi

r - 在多个表达式上使用 eval(substitute())

转载 作者:行者123 更新时间:2023-12-04 12:29:49 27 4
gpt4 key购买 nike

我之前问过一个关于How to take in text/character argument without quotes的问题.在我在那个问题中提供的场景中,参数的数量是固定的,所以我在函数定义中使用的 eval(substitute()) 的数量对应于我拥有的参数数量。

现在我有一个场景,我有一个参数,例如 factors (见下文),并且用户可以指定多个列名而无需在它们周围使用引号 - 即,他们将使用 factor1而不是 "factor1" .我想评估用户提供的每个列名。

foo<-function(data.frame, factors){

}

问题 1:我想知道当表达式的数量可以变化时,是否有一种方法可以将 eval(substitute()) 应用于多个表达式。

正如所指出的, eval(substitute()) 可能存在潜在危险,并且在某些情况下可能会失败。

问题 2:除了使用带引号的列名之外,还有没有更优雅的方法来处理这个问题,如下所示:
foo<-function(data.frame, factors){
output<-data.frame[, factors]
output
}
foo(data.frame=dataset, factors=c("factor1", "factor2"))

最佳答案

首先,在您提供的示例中,我绝对更喜欢使用带引号的列名。对他们有利的一件事是他们将允许有用的间接访问,如下所示:

XX <- c("cyl", "mpg")
foo(mtcars, XX)

也就是说,如果您确实想传入未引用符号的向量,这将解决您的 问题 2 .
foo <- function(data, factors) {
jj <- as.character(substitute(factors)[-1])
data[,jj]
}

head(foo(data = mtcars, factors = c(cyl, mpg)))
# cyl mpg
# Mazda RX4 6 21.0
# Mazda RX4 Wag 6 21.0
# Datsun 710 4 22.8
# Hornet 4 Drive 6 21.4
# Hornet Sportabout 8 18.7
# Valiant 6 18.1

关于r - 在多个表达式上使用 eval(substitute()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15528108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com