2014-12-09 2 views
4

을 대체하는 나는 다음과 같은 코드가 있습니다사용 대용품은() 레이블/인수 이름

eval(substitute(list(x = y), list(x = "foo", y = "bar"))) 

list(x = "bar") 반환, 즉 단지 값이 대체됩니다하지만 레이블을.

은 레이블을 바꾸어 결과가 list(foo = "bar")이되도록합니다.

답변

4

x은 이름에 바인딩됩니다. 우리는

as.list(substitute(list(x = y))) 
# [[1]] 
# list 
# 
# $x 
# y 

에 따라서는 substitute 호출 내에서 이름을 변경 정말 쉽지 않은 것을 볼 수 있습니다. 하지만 당신은

e <- substitute(list(x = y), list(y = "bar")) 
names(e)[2] <- "foo" 
eval(e) 
# $foo 
# [1] "bar" 

하거나 substitute 당신이 setNames

e <- substitute(setNames(list(y), x), list(x = "foo", y = "bar")) 
eval(e) 
# $foo 
# [1] "bar" 

를 사용하는 식을 변경할 수 있습니다 할 수 있습니다하지만 당신은 또한 내가 와서

cl <- call("list", foo = "bar") 
eval(cl) 
# $foo 
# [1] "bar" 
+0

답변을 주셔서 감사 드리며 다양한 접근법을 지적하십시오. 불행하게도 어느 쪽도 나를 100 % 행복하게하지 못합니다. 나는 오히려 (목록뿐만 아니라) 다른 표현식에도 사용할 수있는 일반적인 솔루션을 찾고있었습니다. 또한 x의 값은 문자열이기 때문에'call()'을 사용하는 것이 효과적이지 않습니다. 왜냐하면 모든 것의 결과가되어야하는 인수 목록의 생성을 전제로하기 때문입니다. 나는 예제 # 2와 # 3과 유사한 두 단계 접근법이 바람직한 접근이라고 인상을받습니다. 나는 substitute()와 친구들이있는 원 스톱 솔루션이 있기를 바랬다. – lith

+0

@lith - 중간에있는'setNames' 코드가 효과가 없을까요? –

+0

글쎄, 원래의 문제를 풀기 위해'do.call()'과 함께 사용할 수 있기 때문에'setNames()'를 좋아하기 시작했습니다. 감사. – lith

0

쉽게 call을 사용할 수 있습니다 이 괴물과 :

eval (parse (tex (x = "foo", y = "bar")))))))))))))))))))))))))))))))))))))

+0

"괴물"에 감사드립니다. :-) 나는 문자열 munging을 피하고 싶습니다. – lith