2013-02-01 2 views
5

필자는 쓰기/디버깅 기능을 수행 할 때 브레이크 포인트가 아닌 cell mode을 사용하려고합니다.코드가 함수로 실행되는지 또는 셀 모드를 사용하여 실행되는지 확인하는 방법

현재 실행중인 코드가 함수로 실행되거나 셀 모드를 사용하는 경우 런타임시 어떻게 결정합니까?

보너스 포인트 다른 기능이나 셀에서 호출 된 것으로 알고있는 function을 생각해낼 수 있다면.

예를 들어 함수를 실행하는 동안 데이터를 다르게로드하거나 디버깅을 위해 플로터를 만들려는 경우에 유용 할 수 있습니다. 셀 또는 함수로 실행 사이를 전환 할 때 특정 행을 주석 처리하는 것은 고통이됩니다.

function doSomethingAwesome(inputs) 
%% 

if executingAsCell == true 
    clear 
    importData 
end 


% process stuff 

if executingAsCell == true 
    plot(myAwesomeResults) 
end 

참고이 내 앞의 질문의 중복되지 않습니다 : @Junuxx에 의해 제안하는 가장 간단한 방법은 dbstack()을 사용 How to determine if code is executing as a script or function?

+0

+1 흥미로운 질문입니다. 첫 번째 생각 (추한 해킹) : 함수/스크립트에서 더미 변수를 가장 먼저 정의한 다음 정의 된 변수인지 나중에 확인하는 것은 어떻습니까? – user1884905

+3

[dbstack] (http://www.mathworks.nl/help/matlab/ref/dbstack.html)으로이 작업을 수행 할 수 있습니다. – Junuxx

답변

2

:

if isempty(dbstack) 
    %# true if you evaluated the cell while not in debug mode 

마찬가지로, 기능 수 dbstack의 길이를 확인하여 다른 함수 또는 기본/셀에서 호출되었는지 여부를 확인하십시오.

function doSomething 
    if length(dbstack)==1 
     %# the function has been invoked from a cell or the command line 
     %# (unless you're in debug mode) 

후자는 역사에 기록하지 않기 때문에 함수 실제로, 그것은 명령 줄 또는 셀에서 호출되었는지 여부를 구별 할 수 있습니다

function doSomething 

    if length(dbstack)==1 
     javaHistory=com.mathworks.mlservices.MLCommandHistoryServices.getSessionHistory; 
     lastCommand = javaHistory(end).toCharArray'; % ' added for SO code highlighting 
     if strfind(lastCommand,'doSomething') 
     %# Probably invoked via command line 
     else 
     %# Probably invoked via executing a cell 

당신이있어 여부를 결정하려면 디버그 모드에서 또는하지 않으면 dbstack에서 line - 인수를 사용하고 명백한 호출 함수에서 현재 실행중인 함수에 대한 호출이 있는지 여부를 확인해야합니다.

+0

@Slayton : 편집 해 주셔서 감사합니다. Amro가 제공하는 userscript를 사용하기 때문에 (태그 위키 참조), 더 이상 코드를 강조 표시하지 않습니다. – Jonas

관련 문제