As Sergey says, directly assigning a NULL will initialize a variable of type logical.
However, you can assign a correct type first. E.g., your first example can be changed to:
zz = 0
zz = NULL
? str(zz, 5)
Difference in opinions hath cost many millions of lives: for instance, whether flesh be bread, or bread be flesh; whether whistling be a vice or a virtue; whether it be better to kiss a post, or throw it into the fire... (from Gulliver's Travels)