R tilde运算符可以用哪种通用性来构建匿名函数?

R tilde运算符可以用哪种通用性来构建匿名函数?,r,anonymous-function,tilde,R,Anonymous Function,Tilde,在一些函数(如dplyr::mutate_at或purrr::map)中,可以使用tilde操作符~构建匿名函数 例如,你可以像链接问题中那样做:map(iris,~length(unique())) 或者:mtcars%>%mutate\u all(~.*2) 我试着在sapply中模仿这一点,以避免sapply(列表、函数(项){something\u with\u item})。我当时正在写sapply(list,~something_with_u.),但我遇到了一个错误 Error in

在一些函数(如
dplyr::mutate_at
purrr::map
)中,可以使用tilde操作符
~
构建匿名函数

例如,你可以像链接问题中那样做:
map(iris,~length(unique()))

或者:
mtcars%>%mutate\u all(~.*2)

我试着在
sapply
中模仿这一点,以避免
sapply(列表、函数(项){something\u with\u item})
。我当时正在写
sapply(list,~something_with_u.)
,但我遇到了一个错误

Error in match.fun(FUN) : 
  '~ something_with_.' is not a function, character or symbol
一个可重复的例子:

> sapply(names(mtcars),function(item) mean(mtcars[[item]]))
       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
> sapply(names(mtcars),~mean(mtcars[[.]]))
Error in match.fun(FUN) : 
  '~mean(mtcars[[.]])' is not a function, character or symbol
为什么??将这种结合理解为一种功能只是一些包的行为,如
dplyr
purrr
?对于某些特殊情况,base
R
是否理解


谢谢大家!

公式对象不是函数,只有在将公式传递到的被调用函数被编写为将公式参数解释为函数时,公式才会被视为函数。许多tidyverse函数都是这样编写的,但一般来说,公式在默认情况下不是函数

fn$ gusbfn包确实有
fn$
,这将允许几乎任何接受函数参数的函数接受公式。在函数调用之前加入
fn$
,然后将公式参数解释为函数(根据特定规则)

根据问题中的示例,我们可以这样做,而不需要编写特殊版本的
sapply
来将公式解释为函数:

library(gsubfn)

fn$sapply(names(mtcars), item ~ mean(mtcars[[item]]))
给予:

       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
function (item) 
mean(mtcars[[item]])
有关更多信息和示例,请参见
?fn

match.funfn gsubfn包还具有
match.funfn
,与base R中的
match.fun
类似,只是它还将公式解释为函数。这让我们可以编写自己的函数,接受公式参数,将它们解释为函数

就问题中的例子而言:

library(gsubfn)

sapplyfn <- function(X, FUN, ...) {
  FUN <- match.funfn(FUN)
  sapply(X, FUN, ...)
}

sapplyfn(names(mtcars), item ~ mean(mtcars[[item]]))
函数公式 gsubfn包还具有将公式转换为函数的
as.function.formula
。它由
fn$
match.funfn
使用。比如说,

library(gsubfn)
as.function(item ~ mean(mtcars[[item]]))
给予:

       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
function (item) 
mean(mtcars[[item]])

公式对象不是函数,只有当公式传递到的被调用函数被编写为将公式参数解释为函数时,公式才会被视为函数。许多tidyverse函数都是这样编写的,但一般来说,公式在默认情况下不是函数

fn$ gusbfn包确实有
fn$
,这将允许几乎任何接受函数参数的函数接受公式。在函数调用之前加入
fn$
,然后将公式参数解释为函数(根据特定规则)

根据问题中的示例,我们可以这样做,而不需要编写特殊版本的
sapply
来将公式解释为函数:

library(gsubfn)

fn$sapply(names(mtcars), item ~ mean(mtcars[[item]]))
给予:

       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
function (item) 
mean(mtcars[[item]])
有关更多信息和示例,请参见
?fn

match.funfn gsubfn包还具有
match.funfn
,与base R中的
match.fun
类似,只是它还将公式解释为函数。这让我们可以编写自己的函数,接受公式参数,将它们解释为函数

就问题中的例子而言:

library(gsubfn)

sapplyfn <- function(X, FUN, ...) {
  FUN <- match.funfn(FUN)
  sapply(X, FUN, ...)
}

sapplyfn(names(mtcars), item ~ mean(mtcars[[item]]))
函数公式 gsubfn包还具有将公式转换为函数的
as.function.formula
。它由
fn$
match.funfn
使用。比如说,

library(gsubfn)
as.function(item ~ mean(mtcars[[item]]))
给予:

       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
       mpg        cyl       disp         hp       drat         wt       qsec 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
        vs         am       gear       carb 
  0.437500   0.406250   3.687500   2.812500 
function (item) 
mean(mtcars[[item]])

正如Calwellst上面所说,tilda
~
用于创建一个公式对象,这是一段未计算的代码,以后可以使用。公式与函数不同,
purr
函数使用公式,因为它们在后台调用
rlang::as_function
(通过
purr::as_mapper
)。
*apply
函数显然不能做到这一点,尽管您可以通过在自己修改的
*apply
函数中调用上述函数之一来模拟这种行为(最好只使用
映射
函数,以下只是为了说明这一点):

#使用'as_mapper()'编写函数。

fapply如上所述,tilda
~
用于创建一个公式对象,这是一些未计算的代码,可以稍后使用。公式与函数不同,
purr
函数使用公式,因为它们在后台调用
rlang::as_function
(通过
purr::as_mapper
)。
*apply
函数显然不能做到这一点,尽管您可以通过在自己修改的
*apply
函数中调用上述函数之一来模拟这种行为(最好只使用
映射
函数,以下只是为了说明这一点):

#使用'as_mapper()'编写函数。

fapply其他人可以进行更深入的研究,但本质上tilde指定了一个
公式
对象,而
tidyverse
通常采用该对象进行非标准评估,而基本apply系列不接受,因此仍然希望提供
函数
。有关其在
tidyverse
中实现的更多详细信息,请参见此小插曲:其他人可以更深入,但本质上tilde指定一个
公式
对象,而
tidyverse
通常采用该对象进行非标准求值,而基本应用族不接受,因此,仍然希望提供
功能。有关其实现的更多详细信息,请参见本小插曲,请参见
tidyverse