访问逻辑条件中引用的对象

时间:2016-02-07 18:35:07

标签: r

我正在为一个类编写一个xor函数,所以虽然对现有xor函数的任何建议都很好,但我必须编写自己的函数。我在网上搜索过,但到目前为止还没有找到任何解决方案。我也意识到我的编码风格可能不是最佳的。所有的批评都会受到欢迎。

如果一个条件为真,我编写一个将返回元素为TRUE的函数。条件以字符串形式给出,否则它们会因意外符号(例如>)而产生错误。我想输出一个a和b的成对元素列表,其中我的xor函数为真。

问题在于,虽然我可以根据条件创建xor T / F的逻辑向量,但我无法直接访问对象以对它们进行子集化。条件是函数参数,而不是对象本身。

'%xor%' <- function(condition_a, condition_b) {
  # Perform an element-wise "exclusive or" on the conditions being true.
  if (length(eval(parse(text= condition_a))) != length(eval(parse(text= condition_b))))
     stop("Objects are not of equal length.")  # Objects must be equal length to proceed
  logical_a <- eval(parse(text= condition_a))  # Evaluate and store each logical condition
  logical_b <- eval(parse(text= condition_b))
  xor_vector <- logical_a + logical_b == 1  # Only one condition may be true.
  xor_indices <- which(xor_vector == TRUE)  # Store a vector which gives the indices of the elements which satisfy the xor condition.
  # Somehow access the objects in the condition strings
  list(a = a[xor_indices], b = b[xor_indices])  # Desired output
}

# Example:
a <- 1:10
b <- 4:13
"a < 5" %xor% "b > 4"

期望的输出:

$a
 [1]  1  5  6  7  8  9 10
$b
 [1]  4  8  9 10 11 12 13

我考虑过在ls()grep()的组合中查找条件中的现有对象名称,但如果条件中的对象未初始化,则会遇到问题。例如,如果有人试图运行"c(1:10) < 5" %xor% "c(4:13) > 4"

0 个答案:

没有答案