R's deparse(替代(var))的对面?

dav*_*ted 5 reflection r

我目前正在循环中调用带有多个参数rp.slidertkrplot库,例如:

rp.slider(rpplot, param1)
rp.slider(rpplot, param2)
Run Code Online (Sandbox Code Playgroud)

等等

理想情况下,我想在循环中执行此操作,例如

for(i in 1:10) 
  rp.slider(rpplot, foo(paste(param,i,sep="")))
Run Code Online (Sandbox Code Playgroud)

foo将编码字符串变量名称(符号?).rp.slider使用将参数转换为字符串deparse(substitute(var)).有没有foo让我这样做的功能?我试过as.symbol,as.nameparse(等等)都没有成功.

任何帮助将非常感激!


澄清一下,deparse(substitute(x))返回[1] "x"- 我想要一种从字符串返回相同输出的方法,即哪些foo输出[1] "x"用于输入deparse(substitute(foo("x")))?可能吗?

Jor*_*eys 15

试试eval(parse(text=...))eval(substitute(...)).

parse(text=...)转动表达式中的字符串,eval计算表达式.请务必使用text参数,因为parse通常会查找文件.忘记这是一个常见的错误.另见?parse?eval.

> a <- 10
> x <- deparse(substitute(a))
> eval(parse(text=x))
[1] 10
Run Code Online (Sandbox Code Playgroud)

要显示如何使用它,您的调整后的代码:

for(i in 1:10)
  eval(parse(text=paste("rp.slider(rpplot,param",i,")",sep="")))
Run Code Online (Sandbox Code Playgroud)

substitute 通过第二个参数中给出的字符串替换语言对象中的值:

for(i in 1:10)
  eval(
    substitute(
      rp.slider(rpplot,x),
      list(x=as.name(paste("param",i,sep="")))
    )
  )
Run Code Online (Sandbox Code Playgroud)

或者,使用帮助文件中的示例:

library(rpanel)
rpplot <- rp.control(title = "Demonstration of rp.tkrplot", h = 1,j=1)

redraw <- function(panel) {
  rp.tkrreplot(panel, tkrp)
}
x <- c('h','j')
rp.tkrplot(rpplot, tkrp, function(panel) plot((1:20)^panel$j, (1:20)^panel$h))

eval(parse(text=paste("rp.slider(rpplot, ",x[1]," , action = redraw,
    from = 0.05, to = 2.00, resolution = 0.05)")))

eval(
  substitute(
    rp.slider(rpplot, x, action=redraw, from=0.05, to=2.00, resolution=0.05),
    list(x = as.name(x[2]))
  )
)
Run Code Online (Sandbox Code Playgroud)

可以在rp.slider的源代码中找到解释为什么这是必要的.在函数中获取varname的构造不是R中使用的标准.事实上,强烈建议不要使用'deparse(substitute())',正是出于这个原因.对于大多数函数,as.expression("x")使用变量名来获取变量.唉,这个rpanel包的作者使这个变得不可能.