【问题标题】:How does one extract the name of a variable in a function that is called from another function in R?如何提取从 R 中的另一个函数调用的函数中的变量名称?
【发布时间】:2010-02-22 09:10:12
【问题描述】:

我的问题是如何从 R 中另一个函数中调用的函数中提取变量的名称?

为了说明,这里举个例子:

a <- function(variable) {

    print(deparse(substitute(variable)))

    internala(substitute(variable))

}

internala <- function(variableXX) {

    namex=deparse(substitute(variableXX))

    print(namex)
}

调用函数a会得到以下结果:

>a(whatever)

[1] "whatever"

[1] "substitute(variable)"

这意味着我可以从a 中提取变量whatever 的名称,但不能从internala 中提取。

对此有什么想法吗?

任何帮助将不胜感激!

玛丽亚

【问题讨论】:

  • 只是要清楚,你想要的行为是什么?我猜你想让a(whatever) 打印whatever 两次?如果您还执行internala(whatever),您是否还希望输出为whatever?如果你调用 foo
  • 是的,你猜对了,我希望 a(whatever) 打印任何内容两次,internala(whatever) 打印任何内容,而且我实际卡住的地方正是你指出的,那就是如果我有另一个函数 foo
  • 基于最后一种情况,您似乎想将表达式一直扩展到顶级调用,但没有进一步的?所以如果还有 foo2

标签: r variables extract


【解决方案1】:

你最好不要和替代品和朋友混在一起——你可能会创建一个很难编程的函数。为什么不直接将变量名称作为字符串显式传递?

【讨论】:

  • 肯定的;使用字符串名称更加直接。
  • 这很有帮助(谢谢),但在函数内部我不得不做var &lt;- get(var_as_string)
【解决方案2】:

您可以更改 a 函数以替换 internala 函数和 eval 它的参数:

a <- function(variable) {
    print(deparse(substitute(variable)))
    eval(substitute(internala(variable))) # this is only change
}

internala <- function(variableXX) {
    namex=deparse(substitute(variableXX))
    print(namex)
}

a(whatever)

正如 hadley 建议的那样,最好直接传递名称。我通常会这样做:

a <- function(variable, vname=deparse(substitute(variable))) {
    print(vname)
    internala(variable, vname)
}

internala <- function(variableXX, namex=deparse(substitute(variableXX))) {
    print(namex)
}

a(whatever)

每个函数都可以在不传递名称的情况下调用,但您可以覆盖它。例如:

a(whatever, "othername")

【讨论】:

    【解决方案3】:

    这里有一些对我有用的东西。但是我不确定这是否是最佳解决方案

    a <- function(variable) {
    print(deparse(substitute(variable)))
    my_command <- paste('internala(',substitute(variable),')',sep = '')
    eval(parse(text = my_command))
    }
    
    internala <- function(variableXX) {
    namex=deparse(substitute(variableXX))
    print(namex)
    }
    

    【讨论】:

    • 赞成,因为它似乎可以解决问题,除了两个小问题:1.) 你应该解析替代,否则如果你调用 a(b + 1),你会得到一个错误。 2.) 根据 maria 的 cmets,您也必须提升父框架。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多