【发布时间】:2011-12-01 21:25:22
【问题描述】:
你能写一个打印出自己名字的函数吗?
(显然没有硬编码)
【问题讨论】:
-
sys.calls可以提供该信息。看看:stackoverflow.com/questions/7307987/… -
这个问题急需回应,“您要解决的问题是什么?”毕竟,有过基于这个问题的竞赛。其中一种要求代码在指定为几种不同语言中的任何一种时编译和运行。
你能写一个打印出自己名字的函数吗?
(显然没有硬编码)
【问题讨论】:
sys.calls 可以提供该信息。看看:stackoverflow.com/questions/7307987/…
你当然可以。
fun <- function(x, y, z) deparse(match.call()[[1]])
fun(1,2,3)
# [1] "fun"
【讨论】:
match.call 似乎有点矫枉过正 - 它基本上只是在您的情况下使用sys.call 默认值(但它可以做更多)。
您可以,但以防万一是因为您想递归调用函数,请参阅?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.
【讨论】:
正如您在此处的其他出色答案中看到的,答案似乎是“是”...
但是,正确的答案实际上是“是的,但并非总是如此”。您可以得到的实际上是用于调用函数的名称(或表达式!)。
首先,使用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 案例)。
【讨论】: