Summary: This function generates a truth table for a boolean function of variable number of arguments. The name of the function passed and its arguments are deduced outside of the computable function scope. The returned value is a logical matrix with columns corresponding to function arguments and result.
library(R.utils)
library(stringr)
truthTable <- function(func, valuesOnly = F) {
numArguments <- length(formals(func))
if(valuesOnly) {
values <- vector(length = 2^numArguments)
for (i in 1:(2^numArguments)) {
arguments <- rev(as.logical(intToBits(i-1)))[-(1:(32-numArguments))]
values[i] <- do.call(func, as.list(arguments))
}
return(values)
}
result <- matrix(nrow = 2^numArguments, ncol = numArguments + 1)
colnames(result) <- c(names(formals(func)), as.character(substitute(func)))
for (i in 1:(2^numArguments)) {
arguments <- rev(as.logical(intToBits(i-1)))[-(1:(32-numArguments))]
result[i, ] <- c(arguments, do.call(func, as.list(arguments)))
}
return(result)
}
Example:
majority <- function(a, b, c) {
return ((a & b) | (b & c) | (a & c))
}
truthTable(majority)
Result:
a b c majority
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE TRUE FALSE
[3,] FALSE TRUE FALSE FALSE
[4,] FALSE TRUE TRUE TRUE
[5,] TRUE FALSE FALSE FALSE
[6,] TRUE FALSE TRUE TRUE
[7,] TRUE TRUE FALSE TRUE
[8,] TRUE TRUE TRUE TRUE
Possible improvements:
- Faster conversion of numeric iterator to logical vector
- Usage of
apply
instead of iterative computation
What could be improved?
Any advice would be appreciated.