r - 将作为函数输出的列表子集,而不将输出声明为变量
问题描述
从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 的所有元素,并以与原始输出相同的格式返回结果列表。
到目前为止,我已经尝试过:
- 类似于此答案中建议的配方。例如,
(combinations(5,2))[(combinations(5,2))[,1]>1]
。这给出了类似于所需数字的内容,但输出不是数组。它似乎是数字的一维向量。 - 通过减号删除不需要的输出。例如,
(combinations(5,2))[-combinations(5,2)[,1]>1]
。这总是返回integer(0)
。 subset
功能。这总是为我返回错误,通常抱怨我的一个论点不合逻辑。我试图通过使用来解决这个问题which
,但这并没有帮助。
我还有哪些其他选择?
解决方案
如果你使用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,])
推荐阅读
- javascript - 如果检查,检查 MomentJS 数据 toString 未正确评估
- spring - 在 Spring Boot 2.0.0 中禁用 Spring Cloud 服务器
- c++ - 当没有生成错误代码时,如何调试 sqlite3_prepare_v2 和 sqlite3_step 未给出预期值?
- amazon-sqs - 单队列蓝绿部署
- java - 如何将 sql 数据库中的列总和显示到 Java 应用程序中?
- java - 在 Java eclipse 中读取 bq 表时出错 - 如何获取 com/google/cloud/http/HttpTransportOptions 包的 jar 文件?
- java - jUnit 中的 assertThat() 自定义错误消息
- c# - Unity 不使用除法计算浮点数
- c# - Entity Framework 如何调和 double 和 float 之间的差异?
- mysql - 用于数字压缩的 MySQL 字符集