嵌套匿名函数的安全性

时间:2014-08-22 15:00:13

标签: r

我想使用一些过滤条件将数据框分成数据框列表,所以我写了一些像这样的代码

library(dplyr)

mySpecies <- iris$Species %>% levels

iris %>%
  function(y) lapply(mySpecies, function(x) filter(y, Species == x))

工作正常。

从内在功能的角度来看,&#34; y&#34;住在parent.env(environment()),所以我们也可以写

iris %>%
  function(x) lapply(mySpecies, function(x) filter(get("x", parent.env(environment())), Species == x))

我的问题是:指定我们正在访问的价值环境是否更好?如果我不这样做,我是否会遇到麻烦?

1 个答案:

答案 0 :(得分:0)

最好避免get成为可能。怎么样的

iris %>%
  function(y) lapply(mySpecies, function(x, y) filter(y, Species == x), y=y)

或者您也可以考虑将split函数与友好的包装器一起使用

dsplit <- function(x, col) split(x, x[[col]])
iris %>% dsplit("Species")

当然,后者将为每个物种创建一个组,您的第一种方法只允许提取子集。