由于%>%运算符的工作方式,这两个函数不会产生相同的输出,但我不明白为什么?

my_function <- function(x) {
 # Extract the name of x
 the_name_of_x <- deparse(substitute(x))
 print(the_name_of_x)
}

my_other_function <- function(x) {
 # Extract the name of x
 the_name_of_x <- x %>% substitute() %>% deparse()
 print(the_name_of_x)
}

# Example
my_function("zaza")
# [1] "\"zaza\""
my_other_function("zaza")
# [1] "x"

我真的不明白这有什么不同.

推荐答案

如果使用本地管道,您将获得与第一个相同的值

yet_another_function <- function(x) {
  # Extract the name of x
  the_name_of_x <- x |> substitute() |> deparse()
  print(the_name_of_x)
}

原因是|>管道实际上重写了语法树,所以它实际上不是一个函数.观察

quote(x |> substitute() |> deparse())
deparse(substitute(x))

然而,%>%是一个函数.它将出现在调用堆栈上.substitute函数使用非标准求值,这意味着它查看传递给该函数的表达式.%>%函数不能完全重写调用.它将函数参数的promise 求值为表达式.substitute是一个特殊的函数,因为如果您想要获取promise 指向的值,则需要在判断promise 之前执行此操作.

您可以看到magrittr管道函数的源代码

`%>%`
function (lhs, rhs) 
{
    lhs <- substitute(lhs)
    rhs <- substitute(rhs)
    kind <- 1L
    env <- parent.frame()
    lazy <- TRUE
    .External2(magrittr_pipe)
}

您可以看到它已经在使用substitute来获取其参数的未求值表达式.promise 不能在这种间接的情况下生存下来.

R相关问答推荐

在ggplot Likert条中添加水平线

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

在(g)子中使用asserable字符

x[[1]]中的错误:脚注越界

如何在xyplot中 for each 面板打印R^2

用黄土法确定区间

如何编辑ggplot的图例字使用自定义对象(gtable)?'

当我们有多个特殊字符时,使用gsub删除名称和代码'

使用外部文件分配变量名及其值

在df中保留原始变量和新变量

Select 季度月值

过滤名称以特定字符串开头的文件

如何在R中通过多个变量创建交叉表?

扩展R中包含列表的数据框

R仅当存在列时才发生变异

R-使用stri_trans_General()将其音译为德语字母

抽样变换-REXP与RWEIBUR

基于R中的引用将向量值替换为数据框列的值

使用列名和r中的前缀 Select 列的CREATE函数

如何使用list_rind在列表中保留已命名但不包含第0行的记录?