Changeset 1914:f4c8559dd359 in orange-bioinformatics


Ignore:
Timestamp:
11/22/13 12:23:56 (5 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Fixed an error when the input data set does not have any suitable attributes.

The widget will now issue a warning.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orangecontrib/bio/widgets/OWVennDiagram.py

    r1906 r1914  
    5555        # Stored input set hints 
    5656        # {(index, inputname, attributes): (selectedattrname, itemsettitle)} 
     57        # The 'selectedattrname' can be None 
    5758        self.inputhints = {} 
    5859 
     
    199200        name = table.name 
    200201        index = len(self.data) 
     202        attrs = source_attributes(table.domain) 
     203        if not attrs: 
     204            self.warning( 
     205                index, "Input {} has no suitable attributes.".format(index)) 
     206 
    201207        self.data[key] = _InputData(key, name, table) 
    202208 
    203         attrs = string_attributes(table.domain) 
    204209        self._setAttributes(index, attrs) 
    205210 
     
    212217    def _remove(self, key): 
    213218        index = self.data.keys().index(key) 
    214         box, combo = self._controlAtIndex(index) 
     219 
     220        # Clear possible warnings. 
     221        self.warning(index) 
     222 
    215223        self._setAttributes(index, None) 
    216224 
     
    235243        name = table.name 
    236244        index = self.data.keys().index(key) 
     245        attrs = source_attributes(table.domain) 
     246        if not attrs: 
     247            self.warning( 
     248                index, "Input {} has no suitable attributes.".format(index)) 
     249        else: 
     250            # Clear possible warnings. 
     251            self.warning(index) 
    237252        self.data[key] = self.data[key]._replace(name=name, table=table) 
    238  
    239         attrs = string_attributes(table.domain) 
    240253 
    241254        self._setAttributes(index, attrs) 
     
    250263        for key, input in self.data.items(): 
    251264            attr = self.itemsetAttr(key) 
    252             items = [str(inst[attr]) for inst in input.table 
    253                      if not inst[attr].is_special()] 
     265            if attr is not None: 
     266                items = [str(inst[attr]) for inst in input.table 
     267                         if not inst[attr].is_special()] 
     268            else: 
     269                items = [] 
    254270 
    255271            item = self.itemsets[key] 
     
    264280        for key, input in self.data.items(): 
    265281            attr = self.itemsetAttr(key) 
    266             items = [str(inst[attr]) for inst in input.table 
    267                      if not inst[attr].is_special()] 
     282            if attr is not None: 
     283                items = [str(inst[attr]) for inst in input.table 
     284                         if not inst[attr].is_special()] 
     285            else: 
     286                items = [] 
    268287 
    269288            title = input.name 
    270289            if key in olditemsets and olditemsets[key].name == input.name: 
     290                # Reuse the title (which might have been changed by the user) 
    271291                title = olditemsets[key].title 
    272292 
     
    279299            self.inputhints.clear() 
    280300            for i, (key, input) in enumerate(self.data.items()): 
    281                 attrs = string_attributes(input.table.domain) 
     301                attrs = source_attributes(input.table.domain) 
    282302                attrs = tuple(attr.name for attr in attrs) 
    283303                selected = self.itemsetAttr(key) 
     304                if selected is not None: 
     305                    attr_name = selected.name 
     306                else: 
     307                    attr_name = None 
    284308                itemset = self.itemsets[key] 
    285309                self.inputhints[(i, input.name, attrs)] = \ 
    286                     (selected.name, itemset.title) 
     310                    (attr_name, itemset.title) 
    287311 
    288312    def _restoreHints(self): 
    289313        settings = [] 
    290314        for i, (key, input) in enumerate(self.data.items()): 
    291             attrs = string_attributes(input.table.domain) 
     315            attrs = source_attributes(input.table.domain) 
    292316            attrs = tuple(attr.name for attr in attrs) 
    293317            hint = self.inputhints.get((i, input.name, attrs), None) 
    294318            if hint is not None: 
    295319                attr, name = hint 
    296                 attr_ind = attrs.index(attr) 
     320                attr_ind = attrs.index(attr) if attr is not None else -1 
    297321                settings.append((attr_ind, name)) 
    298322            else: 
     
    420444        for key, input in self.data.items(): 
    421445            attr = self.itemsetAttr(key) 
    422             mask = map(match, (inst[attr] for inst in input.table)) 
     446            if attr is not None: 
     447                mask = map(match, (inst[attr] for inst in input.table)) 
     448            else: 
     449                mask = [False] * len(input.table) 
     450 
    423451            subset = input.table.select(mask) 
    424452 
     
    493521                domain.getmetas().values() 
    494522            if isinstance(attr, Orange.feature.String)] 
     523 
     524 
     525def discrete_attributes(domain): 
     526    """ 
     527    Return all discrete attributes from the domain. 
     528    """ 
     529    return filter(lambda attr: isinstance(attr, Orange.feature.Discrete), 
     530                  domain.variables + domain.getmetas().values()) 
     531 
     532 
     533def source_attributes(domain): 
     534    """ 
     535    Return all suitable attributes for the venn diagram. 
     536    """ 
     537    return string_attributes(domain) + discrete_attributes(domain) 
    495538 
    496539 
Note: See TracChangeset for help on using the changeset viewer.