2015-11-20 17 views
9

Questa non è esattamente una domanda, perché ho la risposta, ma poiché non sono riuscito a trovare fonti al riguardo, posterò la domanda insieme alla risposta qui nel caso sia di qualche interesse per te. (E anche di poterlo ritrovare se dimentico di come l'ho fatto).Personalizzazione dei suggerimenti di dati nell'editor

Mi sono imbattuto in un problema durante la revisione del codice. L'enorme quantità di variabili non è stata spiegata nel codice e ogni volta volevo sapere il significato di una variabile che ho dovuto cercare nei file Data e/o indovinare il loro significato dalle operazioni che sono state fatte nel codice.

Non c'è bisogno di dire che questo è stato piuttosto lungo e ho cercato il modo migliore per perdere meno tempo.

Prima di tutto, ho inserito tutte le spiegazioni sulle variabili nei commenti, il problema è che si aggiunge un (enorme!) Lotto di righe nello script.

Sto anche utilizzando "Abilita suggerimenti dati in modalità di modifica" in MATLAB. Quando passi il mouse sopra un nome di variabile MATLAB già valutato, ti dà la sua dimensione lungo tutte le dimensioni e almeno i suoi primi valori, rendendo più facile sapere quali oggetti stai manipolando. (Vedi immagine sotto)

enter image description here

L'idea naturale che mi è venuta in mente è stata la seguente: sarebbe possibile fare MATLAB visualizzare alcune informazioni più personalizzati nelle punte di dati?

E la risposta è sì!

enter image description here

vedi codice in risposta

risposta

10

Avremo bisogno di fare un po 'di pre-elaborazione in modo che questo funzioni, vale a dire:

1) Creare un file di dati che collega i nomi delle variabili per la loro descrizione (Questa è la parte noiosa, anche se ho già dovuto farlo per capire il codice. Aggiungi una linea ogni volta che trovi una nuova variabile)

Ho scelto di salvare questi dati in un file CSV, in cui la prima colonna contiene i nomi delle variabili e la seconda contiene le descrizioni, ad es.

enter image description here

2) la funzione di Edit MATLAB datatipinfo (è codice interno è possibile accedere digitando edit datatipinfo nella finestra di comando di MATLAB)

La funzione datatipinfo assomiglia:

function datatipinfo(val) 

% Some error checking/Initialization 


    function prefix=sizeType %#ok<DEFNU> All uses are in EVALC calls. 
     s = size(val); 
     D = numel(s); 
     if D == 2 
      theSize = [num2str(s(1)), 'x', num2str(s(2))]; 
     elseif D == 3 
      theSize = [num2str(s(1)), 'x', num2str(s(2)), 'x', ... 
       num2str(s(3))]; 
     else 
      theSize = [num2str(D) '-D']; 
     end 



     if isempty(val) == 0 
      prefix = [name ': ' theSize ' ' class(val)]; 
     else 
      prefix = [name ': empty ' theSize ' ' class(val)]; 
     end 

    end 

% Some other stuff 

end 

E è la funzione prefix che modificheremo per fare ciò che vogliamo fare, insieme ad alcuni file Anning e la stringa di confronto nella fase di inizializzazione:

A) Fase di inizializzazione:

% Read data from csv file : 
fid = fopen('ToyVars.csv'); 
Data = textscan(fid, '%s%s','whitespace','','delimiter',';'); 
fclose(fid); 

B) Confrontare il nome della variabile che stai in bilico su con i nomi delle variabili in dati

NameFound=0; 
% Get Variable Names and Corresponding comments  
TmpNames=Data{1,1}; 
TmpComments=Data{1,2}; 

% Loop through TmpNames. If a Name matches, assign corresponding comment to the variable Comment 

for ii=1:size(TmpNames,1) 

    if(isequal(char(TmpNames(ii))),name) 

     Comment=char(TmpComments(ii)); 
     NameFound=1; 

    end 

end 

C) Aggiungere il commento nel datatip se NameFound==1

if NameFound 

    if isempty(val) == 0 
     prefix = [name ': ' theSize ' ' class(val) ' : ' Comment]; 
    else 
     prefix = [name ': empty ' theSize ' ' class(val) ' : ' Comment]; 
    end 

else 

    if isempty(val) == 0 
     prefix = [name ': ' theSize ' ' class(val)]; 
    else 
     prefix = [name ': empty ' theSize ' ' class(val) ]; 
    end 

end 

E voilà!

enter image description here

5

Con un lieve ritocco e alcune modifiche alla funzione di chiamata si può anche utilizzare @BillBokeey's answer senza dipendenze esterne. Posizionando una matrice di strutture nello stesso spazio di lavoro della variabile che si sta visualizzando in anteprima, è possibile memorizzare una stringa in un campo con lo stesso nome della variabile e utilizzare evalin con la logica esistente in datatipinfo per ottenere gli input per le modifiche di @ BillBokeey.

per il mio caso Test Io sono la memorizzazione mie corde in una struttura di nome mydatastrings:

mydatastrings.test = 'Test Variable'; 

Nel corpo del datatipinfo ho aggiunto un try blocco:

NameFound = 0; 
try 
    Comment = evalin('caller', sprintf('mydatastrings.%s', name)); 
    NameFound = 1; 
end 

Insieme con @ di BillBokey modifiche alla funzione nidificata prefix:

if NameFound 

    if isempty(val) == 0 
     prefix = [name ': ' theSize ' ' class(val) ' : ' Comment]; 
    else 
     prefix = [name ': empty ' theSize ' ' class(val) ' : ' Comment]; 
    end 

else 

    if isempty(val) == 0 
     prefix = [name ': ' theSize ' ' class(val)]; 
    else 
     prefix = [name ': empty ' theSize ' ' class(val) ]; 
    end 

end 

E otteniamo gli stessi risultati.

file completi sono in this Gist


EDIT:

E 'possibile fare un aggiustamento minimo per datatipinfo per visualizzare un commento senza modificare prefix. Sembra che tutto ciò che viene eseguito, datatipinfo, acquisisca tutte le uscite nella finestra di comando e le visualizzi nel popup piuttosto che nella finestra di comando stessa.

Se sostituiamo la try blocco precedente con semplice:

try 
    Comment = evalin('caller', sprintf('mydatastrings.%s', name)) 
end 

E lasciamo prefix in quanto è in default MATLAB installare, si ottiene la seguente popup:

yay

Questo è anche incluso nel Gist come datatipinfo_noprefix.m

Problemi correlati