Main Content

Resolver el error: Attempt to Add Variable to a Static Workspace.

Problema

Las áreas de trabajo para funciones anidadas y anónimas son estáticas. Esto significa que todas las variables usadas dentro de la función deben estar presentes en el texto del código.

Si intenta añadir dinámicamente una variable al área de trabajo estática de una función anónima, una función anidada o una función que contiene una función anidada dinámicamente, MATLAB® emite un error del tipo

Attempt to add variable to a static workspace. 

Para obtener más información sobre las diferencias entre las áreas de trabajo básica y de función, consulte Áreas de trabajo básica y de función. Para obtener más información acerca de las funciones anidadas, consulte Funciones anidadas.

Posibles soluciones

Declarar la variable por adelantado

Una manera de evitar añadir dinámicamente una variable en áreas de trabajo estáticas es declarar explícitamente la variable en el código antes de asignar dinámicamente un valor a esa variable. Haciéndolo, el nombre de la variable será visible para MATLAB, por lo que el nombre se incluirá en el conjunto fijo de variables que componen el área de trabajo estática.

Por ejemplo, suponga que un script llamado makeX.m asigna dinámicamente un valor a la variable X. Una función que llama a makeX y declara explícitamente X evita el error de adición dinámica porque X está en el área de trabajo de la función.

Una forma habitual de declarar una variable es inicializar su valor en un arreglo vacío:

function noerror

nestedfx

    function nestedfx
        X = [];
        makeX
    end
end

Usar eval, evalin o assignin para asignar nuevas variables a una función anidada

Usar eval, evalin o assignin para asignar nuevas variables dentro de funciones anidadas generará un error.

function staticWorkspaceErrors
    function nest
    % This will error since x is not declared outside of the eval
        eval("x=2"); 
    end
end

En la medida de lo posible, evite estas funciones. Consulte Alternativas a la función eval. Si no puede evitarlas, declare explícitamente la variable dentro de la función principal:

function noStaticWorkspaceErrors
    x = [];
    function nest
    % This will not error since 'x' is declared outside of the eval
        eval("x=2");
    end
end

Usar un script de MATLAB para asignar nuevas variables en una función anidada

Llamar a un script de MATLAB que crea una variable dentro de una función anidada generará un error. En el siguiente ejemplo, el script scriptThatIntroducesZ contiene código que asigna un valor a la variable z. Dado que el código no declara explícitamente que z se está asignando, se producirá un error.

function staticWorkspaceErrors
    function nest
    % This will error since 'z' is not declared outside of this script
        scriptThatIntroducesZ 
    end
end

Para evitar que se produzca un error, declare la variable dentro de la función antes de llamar al script que le asigna un valor.

function noStaticWorkspaceErrors
    function nest
    % This will not error since 'z' is declared outside of the script
        z = [];
        scriptThatIntroducesZ
    end
end

De forma alternativa, convierta el script a una función con un argumento de salida z. Este enfoque también hace que el código sea más claro.

Usar un nombre de variable explícito con la función load

Usar load para asignar variables dentro de funciones anidadas sin especificar explícitamente el nombre de la variable generará un error. En el siguiente ejemplo, load se usa para cargar un archivo MAT que contiene la variable Y. Dado que el código no declara explícitamente que Y se está asignando, se producirá un error.

function staticWorkspaceErrors
    function nest
        % This will error since var Y is not explicitly specified
        load MatFileWithVarY 
    end
end

Para evitar que se produzca un error, especifique en su lugar el nombre de la variable como entrada de la función load.

function noStaticWorkspaceErrors
    function nest
    % This will not error since variables 'x' and 'y' are specified    
        load MatFileWithVarX x
        y = load('MatFileWithVarY','y');
    end
end

De forma alternativa, asigne la salida de la función load a un arreglo de estructuras.

Asignar una variable en el depurador de MATLAB en una función anidada

Durante la depuración, no puede añadir una variable desde la línea de comandos de depuración si se detiene en una función anidada. Asigne la variable al área de trabajo básica, que no es estática.

K>> assignin('base','X',myvalue)

Asignar una variable en una función anónima

Las funciones anónimas no pueden contener asignaciones de variables. Cuando se llame a la función anónima, se producirá un error.

% This will error since 'x' is being assigned inside 
% the anonymous function
@()eval("x=2")

Reescriba la función de forma que no sea necesario asignar variables.

xEquals2 = @()2;
x = xEquals2()
x =

     2

Temas relacionados