通过函数将参数传递给with()

3
有一种方法可以从函数传递参数到 with() 吗?类似这样:
dados <- data.frame(x=1:10, v1=rnorm(10), v2=rnorm(10))

with(dados, v1+v2) # Works

func <- function(data, funcao) {
 with(data, funcao)
}

func(dados, v1+v2) # Fails
func(dados, 'v1+v2') # Fails

我已经尝试过使用eval(),但它也失败了 :/

你实际上想要做什么? - Thomas
1
我相信这是可能的。真正的问题是,你为什么想要那样做。 with 是用于交互式使用的。 - Roland
1
你到底想干什么? - Fernando
我只想保存几十行代码,例如 dados$index <- dados$v1 + dados$v2(就像这个例子一样,我的索引更复杂),并将公式添加到函数调用中。您可以将 with() 更改为 evalq() 或任何有效的方法。 - Rcoster
你尝试实现的功能可能有比创建这个函数更简单(而且不容易出错)的方法。 - Señor O
显示剩余3条评论
1个回答

3

好的,我明白了。您需要在 func 内调用 eval,然后传递一个 expression

dados <- data.frame(x=1:10, v1=rnorm(10), v2=rnorm(10))

func <- function(data, funcao) {
     with(data, eval(funcao))
}

func(dados, expression(v1+v2))

[1] -0.9950362  1.0934899 -0.9791810 -1.2420633 -1.0930204  0.8941630 -2.3307571 -1.5012386  3.2731584  0.2585419

使用字符串:

x = "v1 + v2"
func(dados, parse(text=x))

[1] -0.9950362  1.0934899 -0.9791810 -1.2420633 -1.0930204  0.8941630 -2.3307571 -1.5012386  3.2731584  0.2585419

快要成功了!您有任何想法如何让“funcao”成为一个字符串吗? “as.expression()”没有起作用。 - Rcoster
完美!我刚刚将函数更改为 func <- function(data, funcao) { funcao <- parse(text=funcao) ; return(with(data, eval(funcao))) },这样我就可以直接使用字符串了。谢谢! - Rcoster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接