[R] Why does debugging print() change output of function?

David Winsemius dwinsemius at comcast.net
Sun Sep 7 00:31:49 CEST 2014


The goal: 
   to create a function modeled after `subset` (notorious for its non-standard evaluation) that will take a series of logical tests as unqiuoted expressions to be evaluated in the framework of a dataframe environment and return a dataframe of logicals:


 mtest.data.frame <- 
 function (x, ..., drop=FALSE) 
 { tests <- list(...); print(tests)
     r <- if (length(tests)==0) 
         stop("no 'tests'")
     else { cbind.data.frame(
             lapply( tests, function(t){
                          e <- substitute(t)
                          r <- eval(e, x, parent.frame() )
                  if ( !is.logical(r) ) {
                      stop("'tests' must be logical") }
                     r & !is.na(r) } ) )
     }
 }
#--------------

testdata <- structure(list(group1 = structure(1:7, .Label = c("Group A", 
"Group B", "Group C", "Group D", "Group E", "Group F", "Group G"
), class = "factor"), group2 = structure(c(3L, 3L, 2L, 1L, 1L, 
2L, 3L), .Label = c("LS", "SS", "UNC"), class = "factor"), valid1 = structure(c(2L, 
1L, NA, 1L, 2L, 2L, 1L), .Label = c("N", "Y"), class = "factor"), 
    valid2 = structure(c(1L, 1L, 2L, 1L, 1L, 2L, 1L), .Label = c("N", 
    "Y"), class = "factor"), valid3 = structure(c(4L, 3L, NA, 
    2L, 1L, NA, 5L), .Label = c("0.3", "0.7", "1.2", "1.4", "1.7"
    ), class = "factor"), valid4 = structure(c(2L, 1L, 3L, 4L, 
    1L, 1L, 5L), .Label = c("0.3", "0.4", "0.53", "0.66", "0.71"
    ), class = "factor"), valid5 = structure(c(4L, 1L, NA, NA, 
    3L, NA, 2L), .Label = c("11.2", "11.7", "8.3", "8.5"), class = "factor")), .Names = c("group1", 
"group2", "valid1", "valid2", "valid3", "valid4", "valid5"), row.names = c(NA, 
-7L), class = "data.frame")

#######


> mtest.data.frame(testdata, valid2=="N", valid3 > 1)
[[1]]
[1] "tests are"

[[2]]
[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE

[[3]]
[1]  TRUE  TRUE    NA FALSE FALSE    NA  TRUE

This actually seemed to be somewhat successful, but when ... 

Now if I take out the `print()` call for 'tests', I get an different answer:

> mtest.data.frame <- 
+  function (x, ..., drop=FALSE) 
+  { tests <- list(...)
+      r <- if (length(tests)==0) 
+          stop("no 'tests'")
+      else { cbind.data.frame(
+              lapply( tests, function(t){
+                           e <- substitute(t)
+                           r <- eval(e, x, parent.frame() )
+                   if ( !is.logical(r) ) {
+                       stop("'tests' must be logical") }
+                      r & !is.na(r) } ) )
+      }
+  }
> mtest.data.frame(testdata, valid2=="N", valid3 > 1)
>   # i.e. no answer

-- 

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list