【问题标题】:Function in R to get variable assignment coding?R中的函数来获得变量赋值编码?
【发布时间】:2017-01-05 16:48:13
【问题描述】:

假设我有对象foo:

foo <- 2:12

我希望能够以显示原始赋值语法的方式调用对象foo。例如:

>function(foo)
  2:12

无效的方法:

> paste0(foo)
 [1] "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12"
> quote(foo)
 foo

我该如何正确地做到这一点?

更新:(针对上下文):

我的目标是在函数中提供一个值范围作为参数,但该范围需要按书面形式应用(未画出)。


这是一个示例,试图简化我必须提出这个问题的问题。 (这是我的问题的简化版本,所以我知道这个特定情况有简单的解决方案)。我找到了使代码正常工作的解决方法(参见第 25-26 行)。

func1 <- function(gps,num) { 
  v <- NULL
  for(i in gps) {
    v <- c(v,num^i)
  }
  v
}

func2 <- function(dim,num) { 
  v <- cbind(rep(num,5))
  dim(v)[dim]
}

num.A <- 1
num.B <- 2
num.C <- 3

nums <- objects()[grep('num.',objects())]

gen.func <- function(func,num,other) {
  y <- gsub('num.','',num)
  args <- formalArgs(func)
  args2 <- args
  args2[grep('num',args)] <- paste0(args2[grep('num',args)],'.',y)
  args2[grep('num',args,invert = T)] <- 'x'
  x <<- other
  lst <- mget(c(args2),envir = parent.frame())
  names(lst) <- formalArgs(func)
  do.call(func,lst)
}

gen.func(func1,nums[1],other = 2:12)
gen.func(func2,nums[1],other = 2)

【问题讨论】:

  • 如果可能的话,我更喜欢基本 R 解决方案。我完全欢迎其他方法,但如果可能的话,也请提供一个基本的 R 解决方案:)。
  • 2:12 是从 2 到 12 的序列。也许是 as.list(substitute(foo &lt;- 2:12))[[3]]#2:12
  • 请检查上面已编辑的评论,它给出了输出 2:12 或将其用作函数f1 &lt;- function(expr){ tail(as.list(substitute(expr)),1)[[1]] }; f1(foo &lt;- 2:12) #2:12
  • 一般来说,R 不会保存任何关于对象是如何创建的信息,所以你问的是不可能的。此一般规则的例外情况是,当您创建一个函数时,它确实记录了有关它是如何创建的信息。
  • 这看起来像是一个 XY 问题。更好地描述上下文和您的问题。对象的原始定义不太可能是解决问题所必需的。

标签: r variable-assignment


【解决方案1】:

R 不会以任何方式存储此信息,因此无法检索。为了存储它,您需要以一种重要的方式覆盖 &lt;-

`<-` = function (lhs, rhs) {
    lhs = substitute(lhs)
    assign_expr = bquote({
        assign(.(deparse(lhs, backtick = TRUE)), .(rhs))
        attr(.(lhs), 'repr') = substitute(.(substitute(rhs)))
    })
    eval.parent(assign_expr)
}

那么你可以使用:

> x <- 1 : 5

> x
[1] 1 2 3 4 5
attr(,"repr")
1:5

> attr(x, 'repr')
1:5

【讨论】:

  • 虽然这很聪明,但我不建议世界上任何人使用它。
  • @nicola 完全同意。不过,它可能对非标准用途有用(例如调试)。
  • @theforestecologist 这是bquote 语法的一部分。 You can read up about it in the — admittedly poor — documentation。就像我说的,这很重要,解释bquote 超出了这个答案的范围。
  • @theforestecologist 松散地说,.(x) 表示在调用环境中用x 中包含的任何内容替换x,其中bquote() 正在创建一个表达式:基本上不包括lhs 字面意思在表达式中,但要包含lhs 所代表的内容。
猜你喜欢
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2018-07-08
  • 2013-11-27
  • 2015-12-07
相关资源
最近更新 更多