bindingIsLocked applied to a locked binding returns a 'logical' that is niether true nor false. Martin> e <- new.env() > e$x <- 1 > e$y <- 2 > lockBinding("x", e)NULL> bindingIsLocked("x", e)[1] TRUE> bindingIsLocked("x", e)==TRUE[1] FALSE> bindingIsLocked("x", e)==FALSE[1] FALSE> bindingIsLocked("y", e)[1] FALSE> bindingIsLocked("y", e)==FALSE[1] TRUE> bindingIsLocked("y", e)==TRUE[1] FALSE> sessionInfo()R version 2.4.0 Under development (unstable) (2006-05-13 r38060) x86_64-unknown-linux-gnu attached base packages: [1] "methods" "stats" "graphics" "grDevices" "utils" "datasets" [7] "base"
Martin Morgan <mtmorgan at fhcrc.org> writes:> bindingIsLocked applied to a locked binding returns a 'logical' that > is niether true nor false.Is this a philosophical question? :-) Here's what I think is going on: BINDING_IS_LOCKED does not return 0/1, but the result of a bit op that will be either 0 or some int where bit 14 is set. The behavior you describe is consistent with a logical value escaping to R where the underlying int is some x > 1. I wonder if ScalarLogical should force 0/1: Index: include/Rinlinedfuns.h ==================================================================--- include/Rinlinedfuns.h (revision 38060) +++ include/Rinlinedfuns.h (working copy) @@ -494,7 +494,7 @@ INLINE_FUN SEXP ScalarLogical(int x) { SEXP ans = allocVector(LGLSXP, 1); - INTEGER(ans)[0] = x; + INTEGER(ans)[0] = (x == 0) ? 0 : 1; return ans; } Otherwise, I think do_bndIsLocked needs to make a similar operation before calling ScalarLogical. But preventing these all purpose logicals from escaping would seem to be a good argument for changing ScalarLogical. + seth