2013-08-02 19 views
14

Tôi muốn tái tạo boolean NA giá trị khi họ cư xử theo R:Làm thế nào để thực hiện đại số boolean trên các giá trị bị thiếu?

NA là một đối tượng logic hợp lệ. Khi một thành phần của x hoặc y là NA, kết quả sẽ là NA nếu kết quả là mơ hồ. Nói cách khác NA & TRUE đánh giá là NA, nhưng NA & FALSE sẽ tính là FALSE. http://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.html

Tôi đã thấy None được khuyến khích cho các giá trị bị mất tích, nhưng Python chuyển đổi None-False khi đánh giá biểu thức boolean, và tính None or False-False. Kết quả tất nhiên phải là None, vì không có kết luận nào có thể được đưa ra vì giá trị còn thiếu.

Làm cách nào để đạt được điều này bằng Python?

EDIT câu trả lời được chấp nhận tính chính xác với Bitwise các toán tử logic, nhưng để đạt được các hành vi tương tự với toán tử logic not, orand, dường như đòi hỏi một sự thay đổi trong các ngôn ngữ lập trình Python.

+0

'(lambda x: x | ~ x) (NA)'? – SingleNegationElimination

Trả lời

9

Như người khác đã nói, bạn có thể xác định lớp học của riêng bạn.

class NA_(object): 
    instance = None # Singleton (so `val is NA` will work) 
    def __new__(self): 
     if NA_.instance is None: 
      NA_.instance = super(NA_, self).__new__(self) 
     return NA_.instance 
    def __str__(self): return "NA" 
    def __repr__(self): return "NA_()" 
    def __and__(self, other): 
     if self is other or other: 
      return self 
     else: 
      return other 
    __rand__ = __and__ 
    def __or__(self, other): 
     if self is other or other: 
      return other 
     else: 
      return self 
    __ror__ = __or__ 
    def __xor__(self, other): 
     return self 
    __rxor__ = __xor__ 
    def __eq__(self, other): 
     return self is other 
    __req__ = __eq__ 
    def __nonzero__(self): 
     raise TypeError("bool(NA) is undefined.") 
NA = NA_() 

Sử dụng:

>>> print NA & NA 
NA 
>>> print NA & True 
NA 
>>> print NA & False 
False 
>>> print NA | True 
True 
>>> print NA | False 
NA 
>>> print NA | NA 
NA 
>>> print NA^True 
NA 
>>> print NA^NA 
NA 
>>> if NA: print 3 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 28, in __nonzero__ 
TypeError: bool(NA) is undefined. 
>>> if NA & False: print 3 
... 
>>> 
>>> if NA | True: print 3 
... 
3 
>>> 
+1

Tôi thích câu trả lời của bạn, nhưng bạn vẫn không thể đánh giá 'NA hoặc True' thành' True'? Ví dụ của bạn sử dụng toán tử bitwise .. – user2646234

+1

Theo như tôi biết, không thể ghi đè "hoặc" và "và". 'NA hoặc True' được hiểu là' (NA .__ nonzero __() == True) | (Đúng .__ nonzero __() == True) '. Nêu tôi sai vui long chân chỉnh tôi; Tôi rất muốn được sai về điều này. http://docs.python.org/2/reference/datamodel.html#emulating-numeric-types –

6

Bạn có thể làm điều này bằng cách tạo ra một lớp học và trọng các phương thức hoạt động boolean.

>>> class NA_type(object): 
     def __and__(self,other): 
       if other == True: 
         return self 
       else: 
         return False 
     def __str__(self): 
       return 'NA' 


>>> 
>>> NA = NA_type() 
>>> print NA & True 
NA 
>>> print NA & False 
False 
+2

'NA & NA' cho' Sai'. Có lẽ không phải là hành vi mong muốn. Ngoài ra, nó có thể là tốt để làm điều gì đó về thực tế là 'if NA: do_whatever()' thực thi 'do_whatever()' mà không cần cảnh báo. – user2357112

+0

@ user2357112 Tôi đã giải quyết hai điểm đó trong câu trả lời của tôi –

+0

@Chris Barker Vâng, câu trả lời của bạn đã hoàn thiện hơn nhiều. Tôi đã chỉ đưa ra một điểm nhảy. – Brien