首页 > 解决方案 > 将作为函数输出的列表子集,而不将输出声明为变量

问题描述

gtools图书馆,取combinations(5,2)。这给出了以下输出:

> combinations(5,2)
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    2    3
 [6,]    2    4
 [7,]    2    5
 [8,]    3    4
 [9,]    3    5
[10,]    4    5

在不将此输出声明为变量的情况下,我希望从此输出中删除第一列中值为 1 的所有元素,并以与原始输出相同的格式返回结果列表。

到目前为止,我已经尝试过:

我还有哪些其他选择?

标签: rlistsubset

解决方案


如果你使用magrittr你可以使用

combinations(5,2) %>% .[.[,1]>1,]

这避免了需要重新combinations计算两次昂贵的计算。

但是为什么要如此努力地避免变量呢?你最终会加倍使用的内存和计算时间。您是否也反对编写函数?为什么不

colFilter <- function(x, col, fun) x[fun(x[,col]),]

然后你可以做

colFilter(combinations(5,2), 1, function(x) x>1)

这会更有效率。

或者管道功能将是

withX <- function(x, expr) eval(substitute(expr), list("."=x), parent.frame())

这允许您编写一个表达式,您传入的值可以.在您希望评估的表达式中引用。

withX(combinations(5,2), .[.[,1]>1,])

推荐阅读