오류 해결: 변수를 정적 작업 공간에 추가해 봅니다.
문제
중첩 함수와 익명 함수의 작업 공간은 정적입니다. 즉, 이러한 함수 내에서 사용되는 모든 변수는 해당 함수의 코드 텍스트 내에 존재해야 합니다.
변수를 익명 함수, 중첩 함수 또는 중첩 함수를 감싸는 함수 중 하나의 정적 작업 공간에 동적으로 추가하려고 하면 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