blob: 30b70dfe154a50fe65af959fb960a34f339884dd [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2009, 2018 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.rj.services;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.rj.data.RObject;
import org.eclipse.statet.rj.data.RStore;
/**
* A function call provides a comfortable way to build and execute
* R function call.
*
* <p>A function call builder for a given function can be created by
* {@link RService#createFunctionCall(String)}.</p>
*
* <p>The builder mainly provides methods to add arguments and to
* finally evaluate the resulting function call in R.</p>
*
* <p>Arguments are added by the <code>#add...()</code> methods. The
* order they are added is exactly the order they are send to R. There
* are add methods for a symbol referring to data existing in R,
* for given R data objects and for single data values which are
* transformed automatically from java primitives into R data objects.
* All methods are available in a variant with and without a parameter
* for the R argument name. An unnamed argument can be specified by
* using the variant without the argument name parameter or by specifying
* the name as <code>null</code>.</p>
*
* <p>The common guidelines in {@link RService} (like concurrency) are effective
* for all evaluation methods in this interface.</p>
*/
@NonNullByDefault
public interface FunctionCall {
/**
* Adds an argument with the given R expression as value.
*
* <p>The expression is parsed and lazily evaluated as known from function calls in R source
* code.</p>
*
* @param arg the name of the argument or <code>null</code> for unnamed
* @param expression a single valid expression
* @return a reference to this object
*
* @see #addChar(String, String) to add a string/character value directly
*/
FunctionCall add(@Nullable String arg, String expression);
/**
* Adds a unnamed argument with the given R expression as value.
*
* <p>The expression is parsed and lazily evaluated as known from function calls in R source
* code.</p>
*
* @param expression a single valid expression
* @return a reference to this object
*
* @see #addChar(String) to add a string/character value directly
*/
FunctionCall add(String expression);
/**
* Adds a argument with the given R data object as value.
*
* @param arg the name of the argument or <code>null</code> for unnamed
* @param data an R data object
* @return a reference to this object
*/
FunctionCall add(@Nullable String arg, RObject data);
/**
* Adds an unnamed argument with the given R data object as value.
*
* @param arg the name of the argument
* @param data an R data object
* @return a reference to this object
*/
FunctionCall add(RObject data);
/**
* Adds an argument with the given boolean/logical as value.
*
* <p>The Java boolean value is transformed into an R data object
* of type {@link RStore#LOGICAL logical}.</p>
*
* @param arg the name of the argument or <code>null</code> for unnamed
* @param logical the value of the argument
* @return a reference to this object
*/
FunctionCall addLogi(@Nullable String arg, boolean logical);
/**
* Adds an unnamed argument with the given boolean/logical as value.
*
* <p>The Java boolean value is transformed into an R data object
* of type {@link RStore#LOGICAL logical}.</p>
*
* @param logical the value of the argument
* @return a reference to this object
*/
FunctionCall addLogi(boolean logical);
/**
* Adds an argument with the given integer as value.
*
* <p>The Java integer value is transformed into an R data object
* of type {@link RStore#INTEGER integer}.</p>
*
* @param arg the name of the argument or <code>null</code> for unnamed
* @param integer the value of the argument
* @return a reference to this object
*/
FunctionCall addInt(@Nullable String arg, int integer);
/**
* Adds an unnamed argument with the given integer as value.
*
* <p>The Java integer value is transformed into an R data object
* of type {@link RStore#INTEGER integer}.</p>
*
* @param integer the value of the argument
* @return a reference to this object
*/
FunctionCall addInt(int integer);
/**
* Adds an argument with the given double/numeric as value.
*
* <p>The Java double value is transformed into an R data object
* of type {@link RStore#NUMERIC numeric}, also called real.</p>
*
* @param arg the name of the argument or <code>null</code> for unnamed
* @param numeric the value of the argument
* @return a reference to this object
*/
FunctionCall addNum(@Nullable String arg, double numeric);
/**
* Adds an unnamed argument with the given double/numeric as value.
*
* <p>The Java double value is transformed into an R data object
* of type {@link RStore#NUMERIC numeric}, also called real.</p>
*
* @param arg the name of the argument
* @param numeric the value of the argument
* @return a reference to this object
*/
FunctionCall addNum(double numeric);
/**
* Adds an argument with the given string/character as value.
*
* <p>The Java String value is transformed into an R data object
* of type {@link RStore#CHARACTER character}.</p>
*
* @param arg the name of the argument or <code>null</code> for unnamed
* @param character the value of the argument
* @return a reference to this object
*/
FunctionCall addCplx(@Nullable String arg, double real, double imaginary);
/**
* Adds an unnamed argument with the given string/character as value.
*
* <p>The Java String value is transformed into an R data object
* of type {@link RStore#CHARACTER character}.</p>
*
* @param character the value of the argument
* @return a reference to this object
*/
FunctionCall addCplx(double real, double imaginary);
/**
* Adds an argument with the given string/character as value.
*
* <p>The Java String value is transformed into an R data object
* of type {@link RStore#CHARACTER character}.</p>
*
* @param arg the name of the argument or <code>null</code> for unnamed
* @param character the value of the argument
* @return a reference to this object
*/
FunctionCall addChar(@Nullable String arg, String character);
/**
* Adds an unnamed argument with the given string/character as value.
*
* <p>The Java String value is transformed into an R data object
* of type {@link RStore#CHARACTER character}.</p>
*
* @param character the value of the argument
* @return a reference to this object
*/
FunctionCall addChar(String character);
/**
* Adds an argument with the given NULL as value.
*
* <p>The Java String value is transformed into an R data
* {@link RObject#NULL NULL} object.</p>
*
* @param arg the name of the argument or <code>null</code> for unnamed
* @return a reference to this object
*/
FunctionCall addNull(@Nullable String arg);
/**
* Adds an unnamed argument with the given NULL as value.
*
* <p>The Java String value is transformed into an R data
* {@link RObject#NULL NULL} object.</p>
*
* @return a reference to this object
*/
FunctionCall addNull();
/**
* Performs the evaluation of this function call in R without returning a value.
* The method returns after the evaluation is finished.
*
* <p>The evaluation is performed in the global environment of R.</p>
*
* @param monitor a progress monitor to catch cancellation and provide progress feedback.
* @throws CoreException if the operation was canceled or failed; the status
* of the exception contains detail about the cause
*/
void evalVoid(IProgressMonitor monitor) throws CoreException;
/**
* Performs the evaluation of this function call in R without returning a value.
* The method returns after the evaluation is finished.
*
* <p>This method allows advanced configuration for the evaluation.</p>
*
* @param envir the environment where to perform the evaluation; specified by an reference
* or language object, or <code>null</code> for the global environment
* @param monitor a progress monitor to catch cancellation and provide progress feedback.
* @throws CoreException if the operation was canceled or failed; the status
* of the exception contains detail about the cause
*
* @since de.walware.rj.services 2.1
*/
void evalVoid(@Nullable RObject envir,
IProgressMonitor monitor) throws CoreException;
/**
* Performs the evaluation of the this function call in R and returns its value as R data object.
* The method returns after the evaluation is finished.
*
* <p>This is a short version of {@link #evalData(String, int, int, IProgressMonitor)}
* sufficient for most purpose. The returned R data objects are created by the default factory
* with no limit in the object tree depth.</p>
*
* <p>The evaluation is performed in the global environment of R.</p>
*
* @param monitor a progress monitor to catch cancellation and provide progress feedback
* @return the evaluated value as R data object
* @throws CoreException if the operation was canceled or failed; the status
* of the exception contains detail about the cause
*/
RObject evalData(IProgressMonitor monitor) throws CoreException;
/**
* Performs the evaluation of the this function call in R and returns its value as R data object.
* The method returns after the evaluation is finished.
*
* <p>This method allows advanced configuration for the returned R data object.</p>
*
* <p>The evaluation is performed in the global environment of R.</p>
*
* @param factoryId the id of the factory to use when creating the RObject in this VM.
* @param options 0
* @param depth object tree depth for the created return value
* @param monitor a progress monitor to catch cancellation and provide progress feedback
* @return the evaluated value as R data object
* @throws CoreException if the operation was canceled or failed; the status
* of the exception contains detail about the cause
*/
RObject evalData(@Nullable String factoryId, int options, int depth,
IProgressMonitor monitor) throws CoreException;
/**
* Performs the evaluation of the this function call in R and returns its value as R data object.
* The method returns after the evaluation is finished.
*
* <p>This method allows advanced configuration for the evaluation and the returned R data
* object.</p>
*
* @param envir the environment where to perform the evaluation; specified by an reference
* or language object, or <code>null</code> for the global environment
* @param factoryId the id of the factory to use when creating the RObject in this VM.
* @param options 0
* @param depth object tree depth for the created return value
* @param monitor a progress monitor to catch cancellation and provide progress feedback
* @return the evaluated value as R data object
* @throws CoreException if the operation was canceled or failed; the status
* of the exception contains detail about the cause
*
* @since de.walware.rj.services 2.1
*/
RObject evalData(@Nullable RObject envir,
@Nullable String factoryId, int options, int depth,
IProgressMonitor monitor) throws CoreException;
/**
* Performs the evaluation of the this function call in R and assign its return value to
* the specified expression.
*
* <p>The target have to be a valid target expression for a R <code>&lt;-</code> assignment
* operation. A single symbol like <code>x</code> or <code>`x-y`</code>, a path in an object
* tree like <code>xlist$item1</code> or <code>xobj@slotName</code> is valid as well as
* special function calls which supports assignments like <code>dim(x)</code>.</p>
*
* <p>The evaluation and assignment is performed in the global environment of R.</p>
*
* @param target a single valid expression to assign the result to
* @param monitor a progress monitor to catch cancellation and provide progress feedback
* @throws CoreException if the operation was canceled or failed; the status
* of the exception contains detail about the cause
*
* @since de.walware.rj.services 2.0
*/
void evalAssign(String target,
IProgressMonitor monitor) throws CoreException;
}