The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

R::YapRI::Data::Matrix.pm

A module to build and pass a Matrix to a YapRI command file

SYNOPSIS

  use R::YapRI::Base;
  use R::YapRI::Data::Matrix;

  ## Constructors:

  my $rmatrix = R::YapRI::Data::Matrix->new({ name => 'matrix1' });
  
  ## Accessors:

  my $matrixname = $rmatrix->get_name();
  $rmatrix->set_name('matrix');

  my $coln = $rmatrix->get_coln();
  $rmatrix->set_coln(3);

  my $rown = $rmatrix->get_rown();
  $rmatrix->set_rown(4);

  my @data = $rmatrix->get_data();
  $rmatrix->set_data(\@data);

  my @colnames = $rmatrix->get_colnames();
  $rmatrix->set_colnames(\@colnames);

  my @rownames = $rmatrix->get_colanmes();
  $rmatrix->set_colnames(\@rownames);

  ## Adding/deleting/changing data:

  $rmatrix->set_coldata($colname, [$y1, $y2, $y3, $y4]);
  $rmatrix->set_rowdata($rowname, [$x1, $x2, $x3]);
  
  $rmatrix->add_column($colname, [$yy1, $yy2, $yy3, $yy4]);
  $rmatrix->add_row($rowname, [$xx1, $xx2, $xx3]);

  my @oldcol = $rmatrix->remove_column($colname);
  my @oldrow = $rmatrix->remove_row($rowname);

  $rmatrix->change_columns($col_x, $col_z);
  $rmatrix->change_rows($row_x, $row_z);


  ## Parsers:
     
  my $rbase = R::YapRI::Base->new();
  $rmatrix->send_rbase($rbase, $mode);
 
  $rmatrix = R::YapRI::Data::Matrix->read_rbase($rbase, $block, $r_object_name);

  ## Slicers:

  my @col2 = $rmatrix->get_column($col_y);
  my @row3 = $rmatrix->get_row($row_x);
  my $elem2_3 = $rmatrix->get_element($row_x, $col_y);

DESCRIPTION

R::YapRI::Data::Matrix is a R::YapRI to manipulate matrices, send to an rbase object (R::YapRI::Base) for further R manipulations.

This module pass perl variables to a R::YapRI::Data::Matrix object that convert them in a R command line that it is passed to R::YapRI::Base object as a block.

 +-----------+    +----------------------+    +------------+    +---+--------+
 | PerlData1 | => | YaRI::Data::Matrix 1 | => |            | => |   | Input  |
 +-----------+    +----------------------+    | YaRI::Base |    | R |--------+
 | PerlData2 | <= | YaRI::Data::Matrix 2 |<=  |            | <= |   | Output |
 +-----------+    +----------------------+    +------------+    +---+--------+

It lets export data to R frame as: matrix (default), data.frames, vector (by_rows or by_columns) and list (by_rows or by_columns).

Rbase communication is based in two functions:

+ send_rbase, to add the matrix to a rbase block.

+ read_rbase, to create a R::YapRI::Data::Matrix based in a R matrix contained in a rbase block.

AUTHOR

Aureliano Bombarely <aurebg@vt.edu>

CLASS METHODS

The following class methods are implemented:

(*) CONSTRUCTORS:

constructor new

  Usage: my $rmatrix = R::YapRI::Data::Matrix->new();

  Desc: Create a new R::YapRI::Data::Matrix object

  Ret: a R::YapRI::Data::Matrix object

  Args: A hash reference with the following parameters:
          name     => a scalar with the matrix name, 
          coln     => a scalar with the column number (int),
          rown     => a scalar with the row number (int),
          colnames => an array ref. with the column names,
          rownames => an array ref. with the row names,
          data     => an array ref. with the matrix data ordered by row.        
        
  Side_Effects: Die if the argument used is not a hash or its values arent 
                right.
                If no coln and rown are used, it will set to 0 by default.

  Example: my $rmatrix = R::YapRI::Data::Matrix->new(
                                     { 
                                       name     => 'matrix1',
                                       coln     => 3,
                                       rown     => 4,
                                       colnames => ['a', 'b', 'c'],
                                       rownames => ['W', 'X', 'Y', 'Z'],
                                       data     => [ 1, 1, 1, 2, 2, 2, 
                                                     3, 3, 3, 4, 4, 4,],
                                     }
                                   );

          

(*) ACCESSORS:

get_name

  Usage: my $name = $matrix->get_name();

  Desc: Get the Matrix name for a R::YapRI::Data::Matrix object

  Ret: $name, a scalar

  Args: None    
        
  Side_Effects: None

  Example: my $name = $matrix->get_name();
          

set_name

  Usage: $matrix->set_name($name);

  Desc: Set the Matrix name for a R::YapRI::Data::Matrix object

  Ret: None

  Args: $name, an scalar    
        
  Side_Effects: Die if undef value is used 

  Example: $matrix->set_name($name);
          

get_coln

  Usage: my $coln = $matrix->get_coln();

  Desc: Get the matrix column number for a R::YapRI::Data::Matrix object

  Ret: $coln, a scalar

  Args: None    
        
  Side_Effects: None

  Example: my $coln = $matrix->get_coln();
          

set_coln

  Usage: $matrix->set_coln($coln);

  Desc: Set the matrix column number for a R::YapRI::Data::Matrix object

  Ret: None

  Args: $coln, an scalar    
        
  Side_Effects: Die if undef value is used.
                Die if colnum number is not a digit

  Example: $matrix->set_coln($coln);
          

get_rown

  Usage: my $rown = $matrix->get_rown();

  Desc: Get the matrix row number for a R::YapRI::Data::Matrix object

  Ret: $rown, a scalar

  Args: None    
        
  Side_Effects: None

  Example: my $rown = $matrix->get_rown();
          

set_rown

  Usage: $matrix->set_rown($rown);

  Desc: Set the matrix row number for a R::YapRI::Data::Matrix object

  Ret: None

  Args: $rown, an scalar    
        
  Side_Effects: Die if undef value is used.
                Die if rown number is not a digit

  Example: $matrix->set_rown($rown);
          

get_colnames

  Usage: my $colnames_aref = $matrix->get_colnames();

  Desc: Get the Matrix column names array for a R::YapRI::Data::Matrix object

  Ret: $colnames_aref, an array reference with the column names

  Args: None    
        
  Side_Effects: None

  Example: my @colnames = @{$matrix->get_colnames()};
          

set_colnames

  Usage: $matrix->set_colnames(\@colnames);

  Desc: Set the matrix column names array for a R::YapRI::Data::Matrix object

  Ret: None

  Args: $col_names_aref, an array reference with the column names
        
  Side_Effects: Die if undef value is used
                Die if argument is not an array reference.
                Die if number of element in the array isnt equal to coln value.
                (except if colnumber is empty)

  Example: $matrix->set_colnames(['col1', 'col2']);
          

get_rownames

  Usage: my $rownames_aref = $matrix->get_rownames();

  Desc: Get the Matrix row names array for a R::YapRI::Data::Matrix object

  Ret: $rownames_aref, an array reference with the row names

  Args: None    
        
  Side_Effects: None

  Example: my @rownames = @{$matrix->get_rownames()};
          

set_rownames

  Usage: $matrix->set_rownames(\@rownames);

  Desc: Set the matrix row names array for a R::YapRI::Data::Matrix object

  Ret: None

  Args: $row_names_aref, an array reference with the row names
        
  Side_Effects: Die if undef value is used
                Die if argument is not an array reference.
                Die if number of element in the array isnt equal to rown value.
                (except if rownumber is empty)

  Example: $matrix->set_rownames(['row1', 'row2']);
          

get_data

  Usage: my $data_aref = $matrix->get_data();

  Desc: Get the matrix data array for a R::YapRI::Data::Matrix object.
        The data is stored as an array ordered by rows.

        Example: Matrix  |1 2 3|  => [1, 2, 3, 4, 5, 6]
                         |4 5 6|
 
  Ret: $data_aref, an array reference with the data as array

  Args: None    
        
  Side_Effects: None

  Example: my @data = @{$matrix->get_data()};
          

set_data

  Usage: $matrix->set_data(\@data);

  Desc: Set the matrix data array for a R::YapRI::Data::Matrix object

  Ret: None

  Args: $data, an array reference with the data ordered by rows

         Example: Matrix  |1 2 3|  => [1, 2, 3, 4, 5, 6]
                          |4 5 6|
        
  Side_Effects: Die if undef value is used
                Die if argument is not an array reference.
                Die if number of element in the array isnt equal to  
                coln x rown (for example if coln=3 and rown=2, it should have
                6 elements)

  Example: $matrix->set_data([1, 2, 3, 4]);
          

(*) INTERNAL MATRIX FUNCTIONS:

_get_indexes

  Usage: my $index_href = $matrix->_get_indexes();

  Desc: Get then matrix indexes for columns and rows, with the following 
        format:
          $index_href = { $row,$col => $array_element }
 
  Ret: $index_href, a hash reference with the matrix indexes.

  Args: None    
        
  Side_Effects: None

  Example: my %indexes = @{$matrix->_get_indexes()};
          

_get_rev_indexes

  Usage: my $revindex_href = $matrix->_get_rev_indexes();

  Desc: Get then matrix indexes for columns and rows, with the following 
        format:
          $index_href = { $array_element => [ $row, $col ] }
 
  Ret: $rindex_href, a hash reference with the matrix indexes.

  Args: None    
        
  Side_Effects: None

  Example: my %revindexes = %{$matrix->_get_rev_indexes()};
          

_set_indexes

  Usage: $matrix->_set_indexes(\%indexes);

  Desc: Set the matrix indexes for the data contained in the matrix

  Ret: None

  Args: \%indexes, a hash reference with key=$row,$col and value=$arrayposition
        
  Side_Effects: Die if undef value is used
                Die if argument is not an hash reference.
                Die if number of element in the hash isnt equal to  
                coln x rown (for example if coln=3 and rown=2, it should have
                6 elements)

  Example: $matrix->set_data([1, 2, 3, 4]);
          

_index_matrix

  Usage: my %index_matrix = $self->_index_matrix();

  Desc: Index the matrix with an array to know segment the matrix in elements
        %index_matrix = ( $arrayposition => { row => $rowposition,
                                              col => $colposition 
                                            });
 
  Ret: The index matrix, a hash with the following elements:
       %index_matrix = ( $arrayposition => { $rowposition, $colposition })

  Args: None  
        
  Side_Effects: None

  Example: my %index_matrix = $self->_index_matrix();
          

_no_duplicate_names

  Usage: $rmatrix->_no_duplicate_names($method);

  Desc: Check if there are duplicate names for col or rows. Die if exists
        duplicates.
 
  Ret: None

  Args: $method, a scalar that can have 'col', 'row' or 'all'. (all by default)
        
  Side_Effects: Overwrite methods that are not 'col' or 'row' with 'all'. 
                Die if it find duplicates.

  Example: $rmatrix->_no_duplicate_names('col');
          

(*) DATA MANAGEMENT FUNCTIONS:

set_coldata

  Usage: $rmatrix->set_coldata($colname, \@col_data);

  Desc: Add data to an existing column, overwriting the old data
 
  Ret: None

  Args: $colname, a scalar with the name of the column
        $coldata_aref, an array ref. with the data of the column    
        
  Side_Effects: Die if no colname is used.
                Die if the number of elements in the data array is different
                than the rown

  Example: $rmatrix->set_coldata('col1', [1, 2]);
           $rmatrix->set_coldata($colnames[0], [1, 2]);
          

set_rowdata

  Usage: $rmatrix->set_rowdata($rowname, \@row_data);

  Desc: Add data to an existing row, overwriting the old data
 
  Ret: None

  Args: $colname, a scalar with the name of the row,
        $rowdata_aref, an array ref. with the data of the row   
        
  Side_Effects: Die if no rowname is used.
                Die if the number of elements in the data array is different
                than the column

  Example: $rmatrix->set_rowdata('row1', [1, 2]);
           $rmatrix->set_rowdata($rownames[0], [1, 2]);
          

add_column

  Usage: $rmatrix->add_column($colname, \@col_data);

  Desc: Add a new column to the object, rebuilding the indexes and edinting
        column number
 
  Ret: None

  Args: $colname, a scalar with the name of the column
        $coldata_aref, an array ref. with the data of the column    
        
  Side_Effects: Die if the number of elements in the data array is different
                than the row number
                Rebuild and reset the matrix indexes and the coln.

  Example: $rmatrix->add_column('col1', [1, 2]);
          

add_row

  Usage: $rmatrix->add_row($rowname, \@row_data);

  Desc: Add a new row to the object, rebuilding the indexes and edinting
        row number
 
  Ret: None

  Args: $rowname, a scalar with the name of the row
        $rowdata_aref, an array ref. with the data of the row   
        
  Side_Effects: Die if the number of elements in the data array is different
                than the col number
                Rebuild and reset the matrix indexes and the rown.

  Example: $rmatrix->add_row('row3', [1, 2]);
          

delete_column

  Usage: my @coldata = $rmatrix->delete_column($colname);

  Desc: Delete a column to the object, rebuilding the indexes and edinting
        column number
 
  Ret: @coldata, an array with the column data deleted

  Args: $colname, a scalar with the name of the column  
        
  Side_Effects: Die if the column doesnt exist.
                Rebuild indexes and reset coln.

  Example: my @coldata = $rmatrix->delete_column('col1');
          

delete_row

  Usage: my @rowdata = $rmatrix->delete_row($rowname);

  Desc: Delete a row to the object, rebuilding the indexes and edinting
        row number
 
  Ret: @rowdata, an array with the row data deleted

  Args: $rowname, a scalar with the name of the row  
        
  Side_Effects: Die if the row doesnt exist.
                Rebuild indexes and reset rown.

  Example: my @rowdata = $rmatrix->delete_row('row1');
          

change_columns

  Usage: $rmatrix->change_columns($colname1, $colname2);

  Desc: Change the order of two columns
 
  Ret: None

  Args: $colname1, column name 1, 
        $colname2, column name 2,  
        
  Side_Effects: Die if the any of the column names used doesnt exist.

  Example: $rmatrix->change_columns('col1', 'col2');
          

change_rows

  Usage: $rmatrix->change_rows($rowname1, $rowname2);

  Desc: Change the order of two rows
 
  Ret: None

  Args: $rowname1, row name 1, 
        $rowname2, row name 2,  
        
  Side_Effects: Die if the any of the row names used doesnt exist.

  Example: $rmatrix->change_rows('row1', 'row2');
          

transpose

  Usage: my $newmatrix = $rmatrix->matrix($matrixname);

  Desc: Create a new matrix executing a transpose over the original matrix
 
  Ret: $newmatrix, a R::YapRI::Data::Matrix object

  Args: $matrixname, a new matrix name
        
  Side_Effects: Use tr_ . $rmatrix->get_name as default name.

  Example: my $newmatrix = $rmatrix->matrix();
          

get_column

  Usage: my @column = $rmatrix->get_column($colname);

  Desc: Get the column data for a concrete columnname
 
  Ret: @column, an array with the column data

  Args: $colname, a scalar with the column name
        
  Side_Effects: return an empty array if the column doesnt exist

  Example: my @column2 = $rmatrix->get_column('column2');
          

get_row

  Usage: my @row = $rmatrix->get_row($rowname);

  Desc: Get the row data for a concrete rowname
 
  Ret: @row, an array with the row data

  Args: $rowname, a scalar with the row name
        
  Side_Effects: return an empty array if the row doesnt exist

  Example: my @row3 = $rmatrix->get_row('row3');
          

get_element

  Usage: my $element = $rmatrix->get_element($rowname, $colname);

  Desc: Get the matrix element for concrete $rowname, $colname pair
 
  Ret: $element, a scalar with the element value

  Args: $rowname, a scalar with the row name
        $colname, a scalar with the column name
        
  Side_Effects: return undef if the row or/and column doesnt exist

  Example: my $element = $rmatrix->get_element($rowname, $colname);
          

(*) R. FUNCTIONS:

_matrix_cmd

  Usage: my $cmd = $rmatrix->_matrix_cmd();

  Desc: Build the command to add a new matrix 
 
  Ret: $cmd, a string with the R command

  Args: None
        
  Side_Effects: None

  Example: my $cmd = $rmatrix->_matrix_cmd();
          

_dataframe_cmd

  Usage: my $cmd = $rmatrix->_dataframe_cmd();

  Desc: Build the command to add a new dataframe to R block
 
  Ret: $cmd, a string with the R command

  Args: None
        
  Side_Effects: If the column names are numeric (f.example: 1), it will
                add an X before (R doesnt accept numeric column names)

  Example: my $cmd = $rmatrix->_dataframe_cmd();
          

_rowvectors_cmd

  Usage: my $cmds_aref = $rmatrix->_rowvectors_cmd();

  Desc: Build the command to add a list of vectors, parsing the matrix
        by rows 
 
  Ret: $cmds_aref, an array ref. with strings with the R command

  Args: None
        
  Side_Effects: Create as many vectors as rows has the matrix, with the
                row names as vector names. If the row names are numeric, 
                it will add an 'X' before the number (for example, 67 will
                be X67).

  Example: my @cmds = @{$rmatrix->_rowvectors_cmd()};
          

_colvectors_cmd

  Usage: my $cmds_aref = $rmatrix->_colvectors_cmd();

  Desc: Build the command to add a list of vectors, parsing the matrix
        by columns 
 
  Ret: $cmds_aref, an array ref. strings with the R command

  Args: None
        
  Side_Effects: Create as many vectors as cols has the matrix, with the
                col names as vector names. If the col names are numeric, 
                it will add an 'X' before the number (for example, 67 will
                be X67).

  Example: my @cmds = @{$rmatrix->_colvectors_cmd()};
          

send_rbase

  Usage: $rmatrix->send_rbase($rbase, $block, $mode);

  Desc: Load the matrix data as a block in a rbase object (R::YapRI::Base)
        The R matrix name will the same than the perl matrix name.
        If block argument is used, it will add the command to this block.
        If block argument is undef or empty, it will create a new block with
        the argument name
 
  Ret: None

  Args: $rbase, a R::YapRI::Base object, 
        $block, block to create or add the data, an undef or empty value
                will create a new block with the matrix name.
        $mode, a scalar with the following possible values matrix, dataframe
               vectors_by_row and vectors_by_col (optional, matrix by default)
             
 
  Side_Effects: Die if no rbase object is used or if the argument used
                is not a R::YapRI::Base object

  Example: ## Default mode (R matrix in a new block with name=matrix_name)
              $rmatrix->send_rbase($rbase);

           ## Adding a matrix to BLOCK1
              $rmatrix->send_rbase($rbase, 'BLOCK1');

           ## Adding a data.frame to GRAPH1
              $rmatrix->send_rbase($rbase, 'GRAPH1', 'dataframe');

           ## Adding as vectors by row to a matrix name block 
              $rmatrix->send_rbase($rbase, '', 'vectors_by_row');

read_rbase

  Usage: my $rmatrix = R::YapRI::Data::Matrix->read_rbase( $rbase, 
                                                        $block, 
                                                        $r_object_name);

  Desc: Create a new block with some R functions to get the data from the
        matrix. Combine it with the base block, run it and get the resultsfile.
        Parse the resultfile and get the data from it, loading it in a new
        matrix object. 
 
  Ret: A new matrix object (R::YapRI::Data::Matrix)

  Args: $rbase, a R::YapRI::Base object, 
        $block, a scalar with the name of the block that contains the R object
                to be read
        $r_object_name, name of the r_object to read
        
  Side_Effects: Die if no rbase object, block name or r_object_name is used.
                Die if rbase objects isnt a R::YapRI::Base object
                Die if block doesnt exist in the R::YapRI::Base object
                Die if the r_object_name doesnt exist in the R block used
                Die if the r_object_name isnt a matrix object.

  Example:  my $rmatrix = R::YapRI::Data::Matrix->read_rbase( $rbase, 
                                                           'BLOCK1', 
                                                           'mymatrix');
          

ACKNOWLEDGEMENTS

Lukas Mueller

Robert Buels

Naama Menda

Jonathan "Duke" Leto

COPYRIGHT AND LICENCE

Copyright 2011 Boyce Thompson Institute for Plant Research

Copyright 2011 Sol Genomics Network (solgenomics.net)

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.