与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]))
)
)