R 中的匿名递归管道

Nak*_*hya 2 r

我正在尝试在 R 中进行匿名递归,并使用管道来学习。下面的代码运行良好

sorttt <- function(list){
  if (length(list) == 0) c() else c(max(list), Recall(list[list < max(list)]))
}

example %>% sorttt
Run Code Online (Sandbox Code Playgroud)

但这段代码出错了,并出现以下错误:Error in example %>% function(list) { : invalid formal argument list for "function"

example %>% function(list){if (length(list) == 0) c() else c(max(list), Recall(list[list < max(list)]))}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么这两者可能表现不同?这些在逻辑上似乎是同一件事。

Gre*_*gor 7

您需要将匿名函数括在括号中,以便它们可以与管道一起使用。

## doesn't work
1:10 %>% function(x) {mean(x)}
# Error in 1:10 %>% function(x) { : 
#   invalid formal argument list for "function"

## works with parens
1:10 %>% (function(x) {mean(x)})
# [1] 5.5
Run Code Online (Sandbox Code Playgroud)

你的功能也是如此:

1:3 %>% 
  (function(list){if (length(list) == 0) c() else c(max(list), Recall(list[list < max(list)]))})
# [1] 3 2 1
Run Code Online (Sandbox Code Playgroud)

这是因为function它本身就是一个函数。A %>% function(x){...}被解释为function(A, x){...}. 括号确保在管道插入参数之前运行整个函数定义。