与R'相反;s deparse(替代(var))?

与R'相反;s deparse(替代(var))?,r,reflection,R,Reflection,我目前正在使用循环中的多个参数从tkrplot库调用rp.slider,例如: rp.slider(rpplot, param1) rp.slider(rpplot, param2) 等等 理想情况下,我希望在一个循环中完成这项工作,例如 for(i in 1:10) rp.slider(rpplot, foo(paste(param,i,sep=""))) 其中foo将字符串编码为变量名(符号?)。使用deparse(替换(var))将参数转换为字符串。是否有一个foo函数可以让我这

我目前正在使用循环中的多个参数从
tkrplot
库调用
rp.slider
,例如:

rp.slider(rpplot, param1)
rp.slider(rpplot, param2)
等等

理想情况下,我希望在一个循环中完成这项工作,例如

for(i in 1:10) 
  rp.slider(rpplot, foo(paste(param,i,sep="")))
其中
foo
将字符串编码为变量名(符号?)。使用
deparse(替换(var))
将参数转换为字符串。是否有一个
foo
函数可以让我这样做?我尝试了
as.symbol
as.name
、和
parse
(以及其他)但都没有成功

任何帮助都将不胜感激


为了澄清,
deparse(substitute(x))
返回
[1]“x”
-我想要一种从字符串返回相同输出的方法,即哪个
foo
输出
[1]“x”
作为输入
deparse(substitute(foo(“x”)
?可能吗

尝试
eval(解析(text=…)
eval(替换(…)

parse(text=…)
在表达式中转换字符串,
eval
对表达式求值。确保使用
text
参数,因为
parse
通常查找文件。忘记这是一个常见的错误。另请参见
?解析
?评估

> a <- 10
> x <- deparse(substitute(a))
> eval(parse(text=x))
[1] 10
substitute
用第二个参数中给定的字符串替换语言对象中的值:

for(i in 1:10)
  eval(
    substitute(
      rp.slider(rpplot,x),
      list(x=as.name(paste("param",i,sep="")))
    )
  )
或者,使用帮助文件中的示例:

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]))
  )
)
库(rpanel)

rpplotrp.slider函数看起来像是在rpanel中,而不是在tkrplot中


一种可能的替代方法是在TeachingDemos包中使用tkexamp函数,它基于列表为绘图(使用tkrplot)构造tk gui,您可以在循环中构造列表,然后调用tkexamp。或者你可以查看tkexamp的代码,看看它是如何解析列表(在一个循环中)来创建tk控件的,尽管查看代码可能会吓跑你的想法。

恐怕不行-返回时eval(expr,envir,enclose)中出现
错误:尝试应用非函数
。谢谢。@daveslanted:正如上面的代码所示,它工作得非常好。如果你没能让它运行起来,那是因为还有别的问题。考虑到您只需要
parse(text=…)
就可以获得在函数中使用的表达式,如上所述。我尝试过,
rp.slider(rpplot,eval(parse(text=param1)))
,但它给出了上述错误。请参阅我在问题下的说明-如果我运行
deparse(替换(eval(parse)(text=“x”)))
我会得到
[1]“eval(parse(text=\“x”)”)
。我不确定我所问的是否可能,因为似乎在内部函数调用之前对deparse/substitute进行了评估?再次感谢。@DaveLanted:另外,parse(text=…)的输入是一个字符串,这意味着您需要parse(text=“param1”)。对不起,我引用了param1。仍然没有运气,我想是因为
deparse(replacement(parse(text=“x”))
仍然返回
[1]“parse(text=\'x\”””
,而不是
[1]“x”
——因此我认为它失败了。如上所述获取错误。为了澄清,
deparse(substitute(x))
返回
[1]“x”
-我想要一种从字符串返回相同输出的方法,即哪个
foo
输出
[1]“x”
作为输入
deparse(substitute(foo(“x”)
?有可能吗?您应该尽量避免循环…@aL3xa:打印时,在大多数情况下使用apply族是不可行的。apply在本地环境中工作,与绘图功能结合使用时会做一些有趣的事情。
plyr
系列的“\ux”函数是另一种可行的选择。我还喜欢
failwith
选项,该选项在特定绘图无法按预期工作时提供故障保护。
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]))
  )
)