2014-01-29 2 views
0

Есть ли способ проанализировать строку с аргументами в список языковых объектов? Например:Разбор строки с аргументами (точек)

> query <- "mpg, cyl, hp:vs" 
> eval(parse(text=paste0("dplyr:::dots(", query, ")"))) 
[[1]] 
mpg 

[[2]] 
cyl 

[[3]] 
hp:vs 

Но это некрасиво, может привести к инъекции кода, и т.д. Есть ли способ, чтобы разобрать query часть отдельно без инъекций в R-код? Я бы очень хотел использовать собственный парсер и избегать ручной модификации кода с помощью строковой манипуляции, потому что аргументы могут содержать код или запятую сами по себе. Например:

query2 <- "foo, 'flip,flop', function(x){print('foo', x)}" 
eval(parse(text=paste0("dplyr:::dots(", query2, ")"))) 

должен давать:

[[1]] 
foo 

[[2]] 
[1] "flip,flop" 

[[3]] 
function(x) { 
    print("foo", x) 
} 

ответ

3
# First, create a string that represents a function call 
string <- paste0("c(", query, ")") 

# Next, parse it, and extract the function call 
call <- parse(text = string)[[1]] 

# Finally, remove the first element (`c`) and 
# convert to a list 
as.list(call[-1]) 

код не оценивается, так что вы должны быть защищены от кода инъекции. (Хотя, конечно, могут быть ошибки переполнения буфера в parse)