【发布时间】:2013-07-06 00:55:05
【问题描述】:
考虑这个实验:
Rgames> oof<-c(6,7,8,0,10)
Rgames> badoof<-vector()
Rgames> oof[badoof]
numeric(0)
Rgames> oof[-badoof]
numeric(0)
Rgames> oof[-0]
numeric(0)
Rgames> oof[-10]
[1] 6 7 8 0 10
Rgames> oof[-c(10,0)]
[1] 6 7 8 0 10
Rgames> oof[!(1:length(oof)%in% c(badoof) )]
[1] 6 7 8 0 10
我知道“只有负整数可以与零混合”是对子集的限制。我不清楚的部分是为什么oof[badoof] 和oof[-badoof] 都没有返回任何内容。这里的背景是我有一个函数可以搜索坏数据并将它们从数据向量中删除。我希望不必单独或通过 if/else 处理没有发现坏项目(即badoof 没有元素)的情况。上面最后一个例子,使用%in% 的例子有效,但我想知道为什么R 不接受索引“-badoof”构造。
编辑:根据 Hong Ooi 的回答,我也应该问:在 [] 中使用负号真的是“NOT”操作,而不是改变实际值指定的指标?
【问题讨论】:
-
一个更有效的替代方法可能是
oof[if (length(badoof) > 0) -badoff else TRUE] -
@agstudy 是的,抱歉 -- 已在编辑中修复。
-
@MatthewPlourde 这会起作用,但出于强迫症的原因 :-) 我试图不使用 if/else。
-
oof[badoof]和oof[-badoof]均不返回任何内容,因为底层 C 代码正在索引向量上循环。如果索引向量的长度为零,则不执行循环并返回零长度向量。关于您的编辑,情况并非如此。-在[内部的解析与它在顶层的解析没有任何不同,也就是说它确实在将索引的值传递给[之前对其进行操作。 -
@JoshuaUlrich 感谢您提供信息。所以现在我知道了:-)。我将不得不发明一些可怕的代码,将
indexvalues<-c(-4,-3,-2)传递给foo[-indexvalues]只是为了混淆目的。