Main Content

오류 해결: 변수를 정적 작업 공간에 추가해 봅니다.

문제

중첩 함수와 익명 함수의 작업 공간은 정적입니다. 즉, 이러한 함수 내에서 사용되는 모든 변수는 해당 함수의 코드 텍스트 내에 존재해야 합니다.

변수를 익명 함수, 중첩 함수 또는 중첩 함수를 감싸는 함수 중 하나의 정적 작업 공간에 동적으로 추가하려고 하면 MATLAB®이 다음과 같은 형식의 오류를 발생시킵니다.

Attempt to add variable to a static workspace. 

기본 작업 공간과 함수 작업 공간의 차이점에 대한 자세한 내용은 기본 작업 공간(Base Workspace)과 함수 작업 공간(Function Workspace) 항목을 참조하십시오. 중첩 함수에 대한 자세한 내용은 중첩 함수 항목을 참조하십시오.

가능한 해결 방법

사전에 변수 선언하기

정적 작업 공간에 변수를 동적으로 추가하지 않도록 하는 한 가지 방법은 값을 해당 변수에 동적으로 할당하기 전에 코드에 변수를 명시적으로 선언하는 것입니다. 그렇게 하면 변수 이름이 MATLAB에 인식되므로 이름이 정적 작업 공간을 구성하는 고정된 변수 집합에 포함됩니다.

예를 들어, makeX.m이라는 스크립트가 변수 X에 값을 동적으로 할당한다고 가정하겠습니다. makeX를 호출하고 X를 명시적으로 선언하는 함수를 사용하는 경우 X가 함수 작업 공간에 있으므로 동적 추가 오류가 발생하지 않습니다.

변수를 선언하는 일반적인 방법은 해당 값을 빈 배열로 초기화하는 것입니다.

function noerror

nestedfx

    function nestedfx
        X = [];
        makeX
    end
end

eval, evalin 또는 assignin을 사용하여 중첩 함수에 새 변수 할당하기

eval, evalin 또는 assignin을 사용하여 중첩 함수 내에 새 변수를 할당하면 오류가 생성됩니다.

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

가능하면 이러한 함수는 사용하지 마십시오. eval 함수의 대안 항목을 참조하십시오. 이러한 함수를 사용해야 할 경우 부모 함수 내에 변수를 명시적으로 선언하십시오.

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

MATLAB 스크립트를 사용하여 중첩 함수에 새 변수 할당하기

중첩 함수 내에 변수를 생성하는 MATLAB 스크립트를 호출하면 오류가 생성됩니다. 아래 예제에서 스크립트 scriptThatIntroducesZ에는 변수 z에 값을 할당하는 코드가 포함되어 있습니다. 코드에서 z가 할당되는 것을 명시적으로 선언하지 않기 때문에 오류가 발생합니다.

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

오류가 발생하지 않도록 하려면 값을 변수에 할당하는 스크립트를 호출하기 전에 함수 내에 해당 변수를 선언하십시오.

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

또는, 스크립트를 함수로 변환하고 z를 출력 인수로 설정하십시오. 이 접근 방식을 사용하면 코드가 명확해집니다.

load 함수와 함께 명시적 변수 이름 사용하기

변수 이름을 명시적으로 지정하지 않고 load를 사용하여 중첩 함수 내에 변수를 할당하면 오류가 생성됩니다. 아래 예제에서는 load를 사용하여 변수 Y를 포함하는 MAT 파일을 불러옵니다. 코드에서 Y가 할당되는 것을 명시적으로 선언하지 않기 때문에 오류가 발생합니다.

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

오류가 발생하지 않도록 하려면 변수 이름을 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

또는, load 함수의 출력값을 구조체형 배열에 할당합니다.

MATLAB 디버거에서 중첩 함수 내에 변수 할당하기

중첩 함수에서 중지된 경우 디버그 중에 디버그 명령 프롬프트를 사용하여 변수를 추가할 수 없습니다. 정적이 아닌 기본 작업 공간에 변수를 할당하십시오.

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

익명 함수에 변수 할당하기

익명 함수는 변수 할당을 포함할 수 없습니다. 익명 함수를 호출하면 오류가 발생합니다.

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

변수 할당이 필요하지 않은 방식으로 함수를 재작성하십시오.

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

     2

관련 항목