--- loncom/lonr 2014/11/16 15:35:27 1.10 +++ loncom/lonr 2014/11/16 17:41:53 1.11 @@ -3,7 +3,7 @@ # The LearningOnline Network with CAPA # Connect to R CAS # -# $Id: lonr,v 1.10 2014/11/16 15:35:27 raeburn Exp $ +# $Id: lonr,v 1.11 2014/11/16 17:41:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -351,12 +351,28 @@ sub getroutput { return 'Error: '.$error; } +# +# Extract data from lines returned by R: +# including: (a) indexed output, e.g., line starts with [1] etc. (index excluded) +# (b) support for legacy use of &cas("R") to retreve matrix and data.frame +# i.e., unserialized data, in which lines may begin [1,] or 1 +# respectively. The approved method for retrieving these types of +# data is to use &cas_hashref(), which uses phpSerialize() to +# serialize the output (thereby eliminating the need for the second +# regexp in the "elsif" when looping over the lines of output. +# excluding: echo of actual (final) expression originally passed to R excluded by +# checking for trailing semicolon. +# + my $realoutput=''; foreach my $line (split(/\n/,$output)) { $line=~s/\s$//gs; if ($line=~/^Error\:/) { $syntaxerr=1; next; } - if ($line=~ /\;$/) { next; } - if (my ($result)=($line=~/^\s*\[?\d+\,?\]?\s*(.*)/)) { $realoutput.=$result."\n"; } + if (my ($result)=($line=~/^\s*\[\d+\]\s*(.*)/)) { + $realoutput.=$result."\n"; + } elsif (($line !~ /\;$/) && (my ($result)=($line=~/^(?:\[\d+\,\]|\d+)\s*(.*)/))) { + $realoutput.=$result."\n"; + } } if (wantarray) { return ($realoutput,$syntaxerr);