Index: src/main/eval.c =================================================================== --- src/main/eval.c (revision 50047) +++ src/main/eval.c (working copy) @@ -1046,6 +1046,17 @@ PROTECT(val = eval(val, rho)); defineVar(sym, R_NilValue, rho); + /* deal with the S4 case, try to dispatch to as.list */ + if( TYPEOF(val) == S4SXP ){ + SEXP expr ; + /* probably should use DispatchOrEval here */ + PROTECT( expr = lang2(install("as.list"), val )); + PROTECT( ans = eval( expr, rho ) ) ; + val = ans ; + UNPROTECT(3); /* expr, ans and val from above*/ + PROTECT(val); + } + /* deal with the case where we are iterating over a factor we need to coerce to character - then iterate */