【问题标题】:Opposite of R's deparse(substitute(var))?与 R 的 deparse(substitute(var)) 相反?
【发布时间】:2011-04-07 03:14:02
【问题描述】:

我目前在循环中使用多个参数从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 会将字符串编码为变量名(符号?)。 rp.slider 使用deparse(substitute(var)) 将参数转换为字符串。是否有一个foo 函数可以让我这样做?我尝试了as.symbolas.nameparse(以及其他)但没有成功。

任何帮助将不胜感激!


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

【问题讨论】:

  • 澄清一下,deparse(substitute(x)) 返回[1] "x" - 我想要一种从字符串返回相同输出的方法,即哪个foo 输出[1] "x" 用于输入deparse(substitute(foo("x")))?有可能吗?
  • 你应该尽量避免循环......
  • @aL3xa :在绘图时,在大多数情况下使用 apply 系列是不可行的。 apply 在本地环境中工作,并在与绘图功能结合使用时会做一些有趣的事情。
  • plyr 系列“_”函数是另一个可行的替代方案。我也喜欢 failwith 选项,它为特定情节无法按预期工作时提供故障保护。

标签: r reflection


【解决方案1】:

试试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 包的作者让这成为不可能。

【讨论】:

  • 恐怕不行 - 回来Error in eval(expr, envir, enclos) : attempt to apply non-function。不过还是谢谢。
  • @daveslanted :它工作得非常好,如上面的代码所示。如果您无法使其运行,那是因为还有其他问题。考虑到您只需要parse(text=...) 即可获取在函数中使用的表达式,如上所述。
  • 我试过了,rp.slider(rpplot, eval(parse(text=param1))) 但它给出了上述错误。请在问题下查看我的说明-如果我运行deparse(substitute(eval(parse(text="x")))),我会得到[1] "eval(parse(text = \"x\"))"。我不确定我所问的是否可能,因为似乎在内部函数调用之前评估了 deparse/substitute?再次感谢。
  • @daveslanted:另外,parse(text=...) 的输入是一个字符串,这意味着你需要 parse(text="param1")。
  • 错字对不起,我确实引用了 param1。我认为仍然没有运气,因为deparse(substitute(parse(text="x"))) 仍然返回[1] "parse(text = \"x\")" 而不是[1] "x" - 所以我认为它因此而失败。得到如上的错误。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 2022-01-12
    • 2022-01-04
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多