我正在为一个类编写一个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"
。