#!/usr/bin/env python2.7 import sys, argparse import logging from subprocess import PIPE, Popen def runFisher(indat, alt): rstr = '''print.matrix <- function(m) write.table(format(m, justify="right"), row.names=F, col.names=F, quote=F); xdat = matrix({0}, 2, 2, byrow = 1); print(xdat); print(fisher.test(xdat, alternative = '{1}'))'''.\ format('c(' + ','.join([eval(repr(i.replace(",", ""))) for i in indat]) + ')', alt) tc = Popen(["R", '--slave', '--vanilla'], stdin = PIPE, stdout = PIPE, stderr = PIPE) out, error = tc.communicate(rstr) return out def iniLogger(args): if args.verbosity > 1: logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s\n%(message)s') else: logging.basicConfig(level = logging.ERROR, format = '%(asctime)s\n%(message)s') return def testTwosided(args): iniLogger(args) print runFisher(args.inData, 'two.sided') return def testGreater(args): iniLogger(args) print runFisher(args.inData, 'greater') return def testLess(args): iniLogger(args) print runFisher(args.inData, 'less') return def getTestArguments(parser): parser.add_argument('inData', metavar = 'DATA', nargs = 4, help='''Input data. MUST be length of 4 AND in the order of [a11, a12, a21, a22] (by row)''') parser.add_argument('-v', '--verbosity', action='store', default = 0, help='''Verbisity argument. 0 for only p-value, 1 for more output''') if __name__ == '__main__': # master_parser = argparse.ArgumentParser( description = '''Fisher's exact test on 2X2 tables | Gao Wang (c) 2011''', prog = 'gw-fisher', fromfile_prefix_chars = '@', epilog = '''Quickly run Fisher's test in R on a 2X2 table''') master_parser.add_argument('--version', action='version', version='%(prog)s 1.0') subparsers = master_parser.add_subparsers() # two-sided test parser = subparsers.add_parser('two', help='Calculate a two-sided p-value') getTestArguments(parser) parser.set_defaults(func=testTwosided) # one-sided test, greater parser = subparsers.add_parser('greater', help='Calculate a one-sided p-value for alternative \'greater\'') getTestArguments(parser) parser.set_defaults(func=testGreater) # two-sided test parser = subparsers.add_parser('less', help='Calculate a one-sided p-value for alternative \'less\'') getTestArguments(parser) parser.set_defaults(func=testLess) # getting args args = master_parser.parse_args() # calling the associated functions args.func(args)