View Javadoc
1   /*
2    * The baseCode project
3    * 
4    * Copyright (c) 2008-2019 University of British Columbia
5    * 
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *       http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   *
18   */
19  package ubic.basecode.util.r;
20  
21  import java.util.List;
22  import java.util.Map;
23  
24  import org.apache.commons.collections4.Transformer;
25  import org.rosuda.REngine.REXP;
26  
27  import ubic.basecode.dataStructure.matrix.DoubleMatrix;
28  import ubic.basecode.dataStructure.matrix.ObjectMatrix;
29  import ubic.basecode.math.linearmodels.LinearModelSummary;
30  import ubic.basecode.util.r.type.OneWayAnovaResult;
31  import ubic.basecode.util.r.type.TwoWayAnovaResult;
32  
33  /**
34   * Abstraction of a connection to R
35   * 
36   * @author Paul
37   * 
38   */
39  public interface RClient {
40  
41      /**
42       * @param argName
43       * @param arg
44       */
45      public void assign( String argName, double[] arg );
46  
47      /*
48       * (non-Javadoc)
49       * 
50       * @see org.rosuda.JRclient.Rconnection#assign(java.lang.String, int[])
51       */
52      public void assign( String arg0, int[] arg1 );
53  
54      /*
55       * (non-Javadoc)
56       * 
57       * @see org.rosuda.JRclient.Rconnection#assign(java.lang.String, java.lang.String)
58       */
59      public void assign( String sym, String ct );
60  
61      public void assign( String argName, String[] array );
62  
63      /**
64       * @param strings
65       * @return the name of the factor generated.
66       */
67      public String assignFactor( List<String> strings );
68  
69      /**
70       * @param factorName
71       * @param list
72       * @return the factor name
73       */
74      public String assignFactor( String factorName, List<String> list );
75  
76      /**
77       * Assign a 2-d matrix.
78       * 
79       * @param matrix
80       * @return the name of the variable by which the R matrix can be referred.
81       */
82      public String assignMatrix( double[][] matrix );
83  
84      /**
85       * Assign a 2-d matrix.
86       * 
87       * @param matrix
88       * @return the name of the variable by which the R matrix can be referred.
89       */
90      public String assignMatrix( DoubleMatrix<?, ?> matrix );
91  
92      /**
93       * Assign a 2-d matrix.
94       * 
95       * @param matrix
96       * @param rowNameExtractor
97       * @return the name of the variable by which the R matrix can be referred.
98       */
99      public String assignMatrix( DoubleMatrix<?, ?> matrix, Transformer rowNameExtractor );
100 
101     /**
102      * Define a variable corresponding to a character array in the R context, given a List of Strings.
103      * 
104      * @param objects, which will be stringified if they are not strings.
105      * @return the name of the variable in the R context.
106      */
107     public String assignStringList( List<?> objects );
108 
109     /**
110      * Run a command that takes a double array as an argument and returns a boolean.
111      * 
112      * @param command
113      * @param argName
114      * @param arg
115      * @return
116      */
117     public boolean booleanDoubleArrayEval( String command, String argName, double[] arg );
118 
119     /**
120      * Convert an object matrix into an R data frame. Columns that look numeric are treated as numbers. Booleans and
121      * Strings are treated as factors.
122      * 
123      * @param matrix
124      * @return variable name in R-land.
125      */
126     public String dataFrame( ObjectMatrix<String, String, Object> matrix );
127 
128     /**
129      * Evaluate a command that returns a dataFrame
130      * 
131      * @param command
132      * @return an ObjectMatrix representation of the data frame.
133      */
134     public ObjectMatrix<String, String, Object> dataFrameEval( String command );
135 
136     /**
137      * Run a command that has a single double array parameter, and returns a double array.
138      * 
139      * @param command
140      * @param argName
141      * @param arg
142      * @return
143      */
144     public double[] doubleArrayDoubleArrayEval( String command, String argName, double[] arg );
145 
146     /**
147      * Run a command that returns a double array with no arguments.
148      * 
149      * @param command
150      * @return
151      */
152     public double[] doubleArrayEval( String command );
153 
154     /**
155      * Run a command that takes two double array arguments and returns a double array.
156      * 
157      * @param command
158      * @param argName
159      * @param arg
160      * @param argName2
161      * @param arg2
162      * @return
163      */
164     public double[] doubleArrayTwoDoubleArrayEval( String command, String argName, double[] arg, String argName2,
165             double[] arg2 );
166 
167     /**
168      * Run a command that takes two double arrays as arguments and returns a double value.
169      * 
170      * @param command
171      * @param argName
172      * @param arg
173      * @param argName2
174      * @param arg2
175      * @return
176      */
177     public double doubleTwoDoubleArrayEval( String command, String argName, double[] arg, String argName2, double[] arg2 );
178 
179     /**
180      * Evaluate the given command
181      * 
182      * @param command
183      * @return
184      */
185     public abstract REXP eval( String command );
186 
187     /*
188      * (non-Javadoc)
189      * 
190      * @see org.rosuda.JRclient.Rconnection#getLastError()
191      */
192     public String getLastError();
193 
194     public int[] intArrayEval( String command );
195 
196     public boolean isConnected();
197 
198     /**
199      * Lower level access to linear model. Fairly simple. Factors are assigned in turn.
200      * 
201      * @param data
202      * @param factors Map of factorNames to factors (which can be expressed as Strings or Doubles). If you care about
203      *        the order the factors are introduced into the model, use a LinkedHashMap.
204      */
205     public LinearModelSummary linearModel( double[] data, Map<String, List<?>> factors );
206 
207     /**
208      * @param data
209      * @param design which will be converted to factors or continuous covariates depending on whether the columns are
210      *        booleans, strings or numerical. Names of factors are the column names of the design matrix, and the rows
211      *        are assumed to be in the same order as the data.
212      * @return
213      */
214     public LinearModelSummary linearModel( double[] data, ObjectMatrix<String, String, Object> design );
215 
216     /**
217      * @param listEntryType a hint about what type of object you want the list to contain. If you set this to be null,
218      *        the method will try to guess, but caution is advised.
219      * @param command R command
220      * @return
221      */
222     public List<?> listEval( Class<?> listEntryType, String command );
223 
224     public boolean loadLibrary( String libraryName );
225 
226     /**
227      * Lower-level access to a simple one-way ANOVA
228      * 
229      * @param data
230      * @param factor
231      * @return
232      */
233     public OneWayAnovaResult oneWayAnova( double[] data, List<String> factor );
234 
235     public Map<String, OneWayAnovaResult> oneWayAnovaEval( String command );
236 
237     /**
238      * Remove a variable from the R namespace
239      * 
240      * @param variableName
241      */
242     public void remove( String variableName );
243 
244     /**
245      * Get a matrix back out of the R context. Row and Column names are filled in for the resulting object, if they are
246      * present.
247      * 
248      * @param variableName
249      * @return
250      */
251     public DoubleMatrix<String, String> retrieveMatrix( String variableName );
252 
253     /**
254      * Run lm with anova on all the rows of a matrix
255      * 
256      * @param dataMatrixVarName from an assignment of a matrix
257      * @param modelFormula and other options that will be passed as the argument to 'lm(...)', that refers to factor
258      *        variables that have already been assigned, using x as the outcome. Example might be x ~ f1 + f2.
259      * @param names of the factors like {"f1", "f2"}.
260      * @return map of row identifiers to populated LinearModelSummaries.
261      */
262     public Map<String, LinearModelSummary> rowApplyLinearModel( String dataMatrixVarName, String modelFormula,
263             String[] factorNames );
264 
265     /**
266      * Evaluate any command and return a string
267      * 
268      * @param command
269      * @return string
270      */
271     public String stringEval( String command );
272 
273     public List<String> stringListEval( String command );
274 
275     /**
276      * Lower-level access to two-way ANOVA
277      * 
278      * @param data
279      * @param factor1
280      * @param factor2
281      * @param includeInteraction
282      * @return result with interaction term information null if includeInteraction = false
283      */
284     public TwoWayAnovaResult twoWayAnova( double[] data, List<String> factor1, List<String> factor2,
285             boolean includeInteraction );
286 
287     /**
288      * Evaluates two way anova commands of the form
289      * <p>
290      * apply(matrix,1,function(x){anova(aov(x~farea+ftreat))}
291      * </p>
292      * and
293      * <p>
294      * apply(matrix,1,function(x){anova(aov(x~farea+ftreat+farea*ftreat))}
295      * </p>
296      * where farea and ftreat have already been transposed and had factor called on them.
297      * 
298      * @param command
299      * @return
300      */
301     public Map<String, TwoWayAnovaResult> twoWayAnovaEval( String command, boolean withInteractions );
302 
303     public void voidEval( String command );
304 
305 }