【发布时间】: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 <- 2:12))[[3]]#2:12 -
请检查上面已编辑的评论,它给出了输出 2:12 或将其用作函数
f1 <- function(expr){ tail(as.list(substitute(expr)),1)[[1]] }; f1(foo <- 2:12) #2:12 -
一般来说,R 不会保存任何关于对象是如何创建的信息,所以你问的是不可能的。此一般规则的例外情况是,当您创建一个函数时,它确实记录了有关它是如何创建的信息。
-
这看起来像是一个 XY 问题。更好地描述上下文和您的问题。对象的原始定义不太可能是解决问题所必需的。
标签: r variable-assignment