【问题标题】:Can an R function access its own name?R 函数可以访问自己的名称吗?
【发布时间】:2011-12-01 21:25:22
【问题描述】:

你能写一个打印出自己名字的函数吗?

(显然没有硬编码)

【问题讨论】:

标签: r function


【解决方案1】:

你当然可以。

fun <- function(x, y, z) deparse(match.call()[[1]])
fun(1,2,3)
# [1] "fun"

【讨论】:

  • 在我的回答中,我试图解释为什么“你当然可以”。声明有点太强了;-)
  • @Tommy:这就是我为你的答案 +1 的原因。我并不是要暗示“可以”意味着它很容易。
  • 另外,match.call 似乎有点矫枉过正 - 它基本上只是在您的情况下使用sys.call 默认值(但它可以做更多)。
【解决方案2】:

您可以,但以防万一是因为您想递归调用函数,请参阅?Recall,它对名称更改具有鲁棒性,并且避免需要以其他方式处理来获取名称。

召回包:基础 R 文档

递归调用

说明:

‘Recall’ is used as a placeholder for the name of the function in
which it is called.  It allows the definition of recursive
functions which still work after being renamed, see example below.

【讨论】:

    【解决方案3】:

    正如您在此处的其他出色答案中看到的,答案似乎是“是”...

    但是,正确的答案实际上是“是的,但并非总是如此”。您可以得到的实际上是用于调用函数的名称(或表达式!)。

    首先,使用sys.call 可能是查找名称的最直接方法,但是您需要将其强制转换为字符串。 deparse 更强大。

    myfunc <- function(x, y=42) deparse(sys.call()[[1]])
    
    myfunc (3) # "myfunc"
    

    ...但是您可以通过多种方式调用函数:

    lapply(1:2, myfunc) # "FUN"
    Map(myfunc, 1:2) # (the whole function definition!)
    x<-myfunc; x(3)   # "x"
    get("myfunc")(3) # "get(\"myfunc\")"
    

    基本问题是函数没有名称 - 只是您通常将函数分配给变量名。不是你必须 - 你可以有匿名函数 - 或者为同一个函数分配许多变量名(上面的 x 案例)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 2021-07-09
      相关资源
      最近更新 更多