Main Content

Compartir datos entre áreas de trabajo

Introducción

Este tema muestra cómo compartir variables entre áreas de trabajo o permitir que se mantengan entre ejecuciones de funciones.

En la mayoría de los casos, las variables creadas dentro de una función son variables locales conocidas solo dentro de esa función. Las variables locales no están disponibles en la línea de comandos ni para ninguna otra función. Sin embargo, existen varias maneras de compartir datos entre funciones o áreas de trabajo.

Prácticas recomendadas: Paso de argumentos

La forma más segura de ampliar el ámbito de una variable de función es usar argumentos de entrada y salida de la función, que permiten pasar valores de variables.

Por ejemplo, cree dos funciones, update1 y update2, que compartan y modifiquen un valor de entrada. update2 puede ser una función local en el archivo update1.m, o una función en su propio archivo, update2.m.

function y1 = update1(x1)
   y1 = 1 + update2(x1);

function y2 = update2(x2)
   y2 = 2 * x2;

Llame a la función update1 desde la línea de comandos y asígnela a la variable Y del área de trabajo básica:

X = [1,2,3];
Y = update1(X)
Y =
     3     5     7

Funciones anidadas

Las funciones anidadas también tienen acceso a las áreas de trabajo de todas las funciones en las cuales están anidadas. Así, por ejemplo, una función anidada puede utilizar una variable (en este caso, x) que esté definida en su función principal:

function primaryFx
   x = 1;
   nestedFx

   function nestedFx
      x = x + 1;
   end
end

Cuando las funciones principales no utilizan una variable dada, la variable permanece local para la función anidada. Por ejemplo, en esta versión de primaryFx, las dos funciones anidadas tienen sus propias versiones de x que no pueden interactuar entre ellas.

function primaryFx
   nestedFx1
   nestedFx2

   function nestedFx1
      x = 1;
   end

   function nestedFx2
      x = 2;
   end
end

Para obtener más información, consulte Funciones anidadas.

Variables persistentes

Cuando declara una variable dentro de una función como persistente, la variable conserva su valor de una llamada de función a la siguiente. Otras variables locales conservan su valor solo durante la ejecución actual de una función. Las variables persistentes son equivalentes a las variables estáticas de otros lenguajes de programación.

Declare variables usando la palabra clave persistent antes de utilizarlas. MATLAB® inicializa las variables persistentes en una matriz vacía, [].

Por ejemplo, defina una función en un archivo denominado findSum.m que inicializa una suma de 0 y, a continuación, añade al valor en cada iteración.

function findSum(inputvalue)
persistent SUM_X

if isempty(SUM_X)
   SUM_X = 0;
end
SUM_X = SUM_X + inputvalue;

Cuando llama a la función, el valor de SUM_X se mantiene entre las ejecuciones posteriores.

Las siguientes operaciones borran las variables persistentes de una función:

  • clear all

  • clear functionname

  • Editar el archivo de la función

Para evitar que se borren las variables persistentes, bloquee el archivo de la función usando mlock.

Variables globales

Las variables globales son variables a las que puede acceder desde las funciones o desde la línea de comandos. Tienen su propia área de trabajo, independiente de las áreas de trabajo básica y de función.

Sin embargo, las variables globales conllevan riesgos notables. Por ejemplo:

  • Cualquier función puede acceder a una variable global y actualizarla. Otras funciones que usen la variable podrían devolver resultados inesperados.

  • Si, involuntariamente, proporciona una "nueva" variable global el mismo nombre que una variable global existente, una función puede sobrescribir los valores esperados por otra. Este error es difícil de diagnosticar.

Utilice las variables globales con moderación, si es que tiene que hacerlo.

Si utiliza variables globales, declárelas usando la palabra clave global antes de acceder a ellas dentro de cualquier ubicación concreta (función o línea de comandos). Por ejemplo, cree una función en un archivo denominado falling.m:

function h = falling(t)
   global GRAVITY
   h = 1/2*GRAVITY*t.^2;

A continuación, introduzca estos comandos en la línea de comandos:

global GRAVITY
GRAVITY = 32;
y = falling((0:.1:5)');

Las dos instrucciones globales hacen que el valor asignado a GRAVITY en la línea de comandos también esté disponible dentro de la función. Sin embargo, como alternativa más sólida, redefina la función para que acepte el valor como entrada:

function h = falling(t,gravity)
   h = 1/2*gravity*t.^2;

A continuación, introduzca estos comandos en la línea de comandos:

GRAVITY = 32;
y = falling((0:.1:5)',GRAVITY);

Evaluación en otras áreas de trabajo

Las funciones evalin y assignin permiten evaluar comandos o nombres de variables a partir de vectores de caracteres y especificar si utilizar el área de trabajo actual o el área de trabajo básica.

Como en el caso de las variables globales, estas funciones conllevan el riesgo de sobrescribir datos existentes. Utilícelas con moderación.

En ocasiones, evalin y assignin son útiles para funciones callback en interfaces gráficas de usuario con respecto a las que evaluar el área de trabajo básica. Por ejemplo, cree un cuadro de lista de nombres de variables del área de trabajo básica:

function listBox
figure
lb = uicontrol('Style','listbox','Position',[10 10 100 100],...
              'Callback',@update_listBox);
update_listBox(lb)

function update_listBox(src,~)
vars = evalin('base','who');
src.String = vars;

Para otras aplicaciones de programación, considere el paso de argumentos y las técnicas descritas en Alternativas a la función eval.

Temas relacionados