@@ -58,16 +58,16 @@ to_vec = function(expr, recursive = TRUE, use.names = FALSE){
5858}
5959
6060
61- add_assignment_to_final_loops = function (expr ){
61+ add_assignment_to_final_loops = function (expr , result_exists = FALSE ){
6262 if (is_loop(expr )){
6363 if (has_loop_inside(expr [- 1 ])){
64- expr [- 1 ] = as.call(lapply(as.list(expr )[- 1 ], add_assignment_to_final_loops ))
64+ expr [- 1 ] = as.call(lapply(as.list(expr )[- 1 ], add_assignment_to_final_loops , result_exists = result_exists ))
6565 } else {
66- expr = add_assignment_to_loop(expr )
66+ expr = add_assignment_to_loop(expr , result_exists = result_exists )
6767 }
6868 } else {
6969 if (has_loop_inside(expr )){
70- expr = as.call(lapply(as.list(expr ), add_assignment_to_final_loops ))
70+ expr = as.call(lapply(as.list(expr ), add_assignment_to_final_loops , result_exists = result_exists ))
7171 }
7272 }
7373 expr
@@ -127,16 +127,46 @@ has_loop_inside = function(expr){
127127}
128128
129129
130- add_assignment_to_loop = function (expr ){
130+ add_assignment_to_loop = function (expr , result_exists = FALSE ){
131131 last_item = length(expr )
132- expr [[last_item ]] = bquote({
133-
134- .__curr = {.(expr [[last_item ]])}
135- if (! is.null(.__curr )){
132+ if (result_exists ){
133+ expr [[last_item ]] = bquote({
134+ .__curr = {.(expr [[last_item ]])}
136135 .___counter = .___counter + 1
137- .___res [[.___counter ]] = .__curr
138- }
136+ if (! is.null(.__curr )){
137+ .___res [[.___counter ]] = .__curr
138+ }
139+
140+ })
141+ } else {
142+ expr [[last_item ]] = bquote({
139143
140- })
144+ .__curr = {.(expr [[last_item ]])}
145+ if (! is.null(.__curr )){
146+ .___counter = .___counter + 1
147+ .___res [[.___counter ]] = .__curr
148+ }
149+
150+ })
151+ }
141152 expr
142153}
154+
155+ # ' @rdname to_list
156+ # ' @export
157+ modify = function (expr , data = NULL ){
158+ expr = substitute(expr )
159+ if (! is_loop(expr )) {
160+ stop(paste(" argument should be expression with 'for', 'while' or 'repeat' but we have: " , deparse(expr , width.cutoff = 500 )[1 ]))
161+ }
162+ on.exit(suppressWarnings(rm(list = c(" .___res" , " .___counter" , " .__curr" ), envir = parent.frame())))
163+ if (is.null(data )) data = expr [[3 ]]
164+ eval.parent(substitute(.___res <- data ))
165+ expr = expand_loop_variables(expr )
166+ expr = add_assignment_to_final_loops(expr , result_exists = TRUE )
167+ eval.parent(quote(.___counter <- 0 )) # initial list length
168+ eval.parent(expr )
169+ res = get(" .___res" , envir = parent.frame())
170+ res
171+
172+ }
0 commit comments