在一个非常具体的情况下,R语言的行为让我有些惊讶。假设我定义了一个函数square
,它返回其参数的平方,就像这样:
square <- function(x) { return(x^2) }
我希望在另一个函数内调用此函数,并且在这样做时还要显示其名称。 我可以使用deparse(substitute())
来实现。 然而,请考虑以下示例:
ds1 <- function(x) {
print(deparse(substitute(x)))
}
ds1(square)
# [1] "square"
这是预期的输出,所以一切都很好。然而,如果我把函数包装在一个列表中,并使用for循环进行处理,将会发生以下情况:
ds2 <- function(x) {
for (y in x) {
print(deparse(substitute(y)))
}
}
ds2(c(square))
# [1] "function (x) " "{" " return(x^2)" "}"
有人能向我解释为什么会发生这种情况,以及我如何防止它发生吗?
x
是一个promise,但它的元素(当分配给y
时)不再是promise,因此substitute
返回一个不同的值。 - A. Stamsubstitute()
返回一个调用对象,而deparse()
将调用对象转换为字符串。如果您将substitute()
的结果提供给生成标题的函数,则可能会直接调用deparse()
,但我不太确定。在 tidyverse 中,您很少需要使用substitute()
,请参阅 Programming with dplyr 稿件,了解用户提供的列标题等所有反应方式。 - akraf