【问题标题】:R function arguments from another environment来自另一个环境的 R 函数参数
【发布时间】:2014-05-08 16:24:40
【问题描述】:

我只是想知道一个简单的问题:

假设我有以下函数,它基本上是一个 SAS MACRO

e<-new.env()
e$graph<-function(a,b,c){
  e$plot<-ggplot()+
          geom_text(aes(label=a......))+
          geom_text(aes(label=b......))+
          geom_text(aes(label=c......))
}
e$graph(e$label_1,e$label_2,e$label_3)

我基本上使用这个函数的方式与 SAS MACRO 的运行方式相同,所以我可以替换 abc 中的任何内容,然后绘制另一个图表。

但是,R 说缺少 a,因为我在默认环境中调用 a,但函数 e$graph() 使用来自环境 e 的参数。

你们知道我该怎么做吗?也许只使用一个参数,它是一个列表,并在每个单元格中,将 e$label_123 分配给它?

【问题讨论】:

  • 请让您的示例独立且可重现。
  • 你想让r函数像sas宏一样吗?
  • @rawr,是的,我刚刚发现我应该使用列表。

标签: r function environment


【解决方案1】:

您可以使用表达式和替换来替换变量,而不是使用环境。

考虑这个例子

runmacro<-function(expr, ...) {
    stopifnot(class(expr)=="expression")
    dots<-list(...)
    subexpr<-do.call(substitute, list(expr[[1]], dots))
    eval(subexpr)
}

#define macro
ex<-expression({
    print(paste("Hello",name,"value",x))
})

#run and swap variables
x<-15;
y<-20;
z<-"y";
runmacro(ex, name="David")
runmacro(ex, name="David", x=y)
runmacro(ex, name="David", x="y")
runmacro(ex, name="David", x=as.symbol(z))

在这里,我设置了一个辅助函数runmacro,它接受一个表达式并将您命名为参数的任何值替换为相应的值。因此,通过传递name="David",我们将表达式中所有出现的变量name 替换为"David" 的值。您可以将变量替换为其他变量或其他值。每个示例都演示了不同的案例。

我会像

那样定义你的宏
pe<-expression({
    plot<-ggplot()+
        geom_text(aes(label=a))+
        geom_text(aes(label=b))+
        geom_text(aes(label=c))
})

在大多数情况下,最好在 R 中编写一个普通的包装函数,但我承认 ggplot 在参数解释方面做了一些疯狂的事情,因此有时会很困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 2022-07-25
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多