我目前正在rp.slider
库中调用tkrplot
并在循环中使用多个参数,例如:
rp.slider(rpplot, param1)
rp.slider(rpplot, param2)
等
理想情况下,我想在循环中执行此操作,例如
for(i in 1:10)
rp.slider(rpplot, foo(paste(param,i,sep="")))
foo
将字符串编码为变量名称(符号?)。 rp.slider使用deparse(substitute(var))
将参数转换为字符串。是否有foo
函数可以让我这样做?我已尝试as.symbol
,as.name
和parse
(等等)但未成功。
非常感谢任何帮助!
为了澄清,deparse(substitute(x))
返回[1] "x"
- 我想要一种从字符串返回相同输出的方法,即输入{foo
输出[1] "x"
1}?可能吗?
答案 0 :(得分: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
要说明如何使用它,请调整代码:
for(i in 1:10)
eval(parse(text=paste("rp.slider(rpplot,param",i,")",sep="")))
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]))
)
)
可以在rp.slider的源代码中找到解释为什么这是必要的。在函数中获取varname的构造不是R中使用的标准。事实上,强烈建议不要使用'deparse(substitute())',正是出于这个原因。对于大多数函数,as.expression("x")
用于使用变量名来获取变量。唉,rpanel
包的作者使这变得不可能。
答案 1 :(得分:0)
rp.slider函数看起来像是在rpanel中,而不是tkrplot。
一种可能的替代方法是在TeachingDemos包中使用tkexamp函数,它根据列表为一个绘图(使用tkrplot)构建一个tk gui,你可以在循环中构造列表,然后调用tkexamp。或者您可以查看tkexamp的代码,看看它如何解析列表(在循环中)以创建tk控件,尽管查看代码可能会吓跑您的想法。