【问题标题】:Converting R function argument into a string将R函数参数转换为字符串
【发布时间】:2020-08-23 17:10:17
【问题描述】:

我有一个看起来像的函数

my_function <- function(object)
{
  # code goes here
}

我希望函数(除其他外)打印参数的名称(传递给函数)。所以如果我的函数调用是:

xxx <- my_function(my_object)

那我想知道如何让函数打印出字符串"my_object"

有人可以帮忙吗?

【问题讨论】:

标签: r function


【解决方案1】:

更多的R-ish 解决方案是结合使用substitute(替换obj)和deparse(将符号转换为字符串):

my_function <- function(obj) {deparse(substitute(obj))}

通用R 元编程规则:首选substitute

my_function(my_object)
## [1] "my_object"

【讨论】:

    【解决方案2】:

    我会建议下一个更接近您想要的方法。当然你可以修改它以获得其他输出:

    #Function
    my_function <- function(x)
    {
      as.character(eval(parse(text=enquo(x)))[2])
    }
    #Apply
    my_function(x = my_object)
    

    输出:

    [1] "my_object"
    

    感谢@MrFlick 的改进接下来是:

    #Function
    my_function <- function(x)
    {
      rlang::as_label(rlang::enquo(x))
    }
    #Apply
    my_function(x = my_object)
    

    在函数中产生具有更优雅风格的相同输出:

    [1] "my_object"
    

    【讨论】:

    • @Alan 谢谢你!!!好问题!如果您认为此答案有帮助,您可以通过单击此答案左侧的勾号来接受它:)
    • 这是 rlang 和 base R 的一个非常奇怪的组合。如果你打算使用 rlang::enquo,使用 rlang::as_label(enquo(x)) 来命名会更有意义。否则,deparse/substitute 在基础 R 中更为惯用。
    • @MrFlick 我已将您提到的内容添加到解决方案中!感谢 Flick 博士的评论!
    【解决方案3】:

    要显示整个通话,请像这样使用match.call

    f <- function(x) { print(match.call()); x }
    f(pi)
    ## f(x = pi)
    ## [1] 3.141593
    

    如果希望在不修改函数本身的情况下仅显示调用以进行调试,则使用trace:

    g <- function(x) x  # test function
    
    trace(g)
    g(pi)
    ## trace: g(pi)
    ## [1] 3.141593
    

    【讨论】: