2013-09-24 3 views
0

Is можно сделать что-то подобное,R - вычислить выражение в виде строки

x = function(n,v) paste("<rel name=\"",quote(n),"\" value=\"",quote(v),"\"/>",sep="") 

так что x(y,1) производит

"<rel name=\"y\" value=\"1\"/>" 

, конечно, это не работает, и вместо этого производит,

"<rel name=\"n\" value=\"v\"/>" 

Также у меня есть ошеломляющее чувство, что этот вид операции имеет техническое название, кто-либо знает что это?

По существу, было бы неплохо, если бы у меня не было x ("y", "1").

ответ

1

Вы ищете substitute:

x = function(n,v) paste("<rel name=\"",substitute(n),"\" value=\"", 
         substitute(v),"\"/>",sep="") 

x(y,1) 
#[1] "<rel name=\"y\" value=\"1\"/>" 

Или, если вы собираетесь иметь более сложные выражения, deparse(substitute(:

x = function(n,v) paste("<rel name=\"",deparse(substitute(n)),"\" value=\"", 
         deparse(substitute(v)),"\"/>",sep="") 

x(y + 2, 3) 
#[1] "<rel name=\"y + 2\" value=\"3\"/>" 
+0

не работает, если п или v содержат, как, х (y, fun (p; d)) – csta

+0

Точка с запятой будет использоваться почти в значениях для v. Кстати, 'quote' не обрабатывает точки с запятой. – csta

+1

@csta, потому что это не действительное выражение R, как'; ' сигналы конца выражения, но вы еще не закрыли круглые скобки, другими словами - это никогда не сработает, независимо от того, что означает 'x' – eddi

1

Вы можете использовать deparse(substitute() или match.call. Примечание. Я использовал sprintf, так как мне легче расшифровывать, чем paste в таких ситуациях.

xx <- function(n,v){ 
     x <- sapply(as.list(match.call())[-1],deparse) 
     sprintf(fmt ='<rel name=\"%s\" value=\"%s\">',x['n'],x['v'])} 
xx(y,2) 
## [1] "<rel name=\"y\" value=\"2\">" 
xx(y, fun(x,b,v)) 
## [1] "<rel name=\"y\" value=\"fun(x, b, v)\">" 

Обратите внимание, что x(y,fun(p;d)) не будет разбирать, как это не является допустимым R выражение (он не будет пройти языковой intepreter даже начать

Смежные вопросы