R-如何通过参考模拟参数



有没有办法?
nb :做这样的事情不是正确的,好还是明智的。
问题是是否有办法,所以您的答案是否"你为什么想这么做?" r使用函数,您想要的曾经称为过程,良好的R使用/样式不会……","您可以解释更好...提供一些代码。

我做了一个快速的尝试,最终使用环境,或多或少地工作了:

function(mydf) {
  varName <- deparse(substitute(mydf))
  ...
  assign(varName,mydf,envir=parent.frame(n = 1))
}  

1(将功能正文包裹在eval.parent(substitute({...}))中:

f <- function(x) eval.parent(substitute({
  x <- x + 1
}))
mydf <- data.frame(z = 1)
f(mydf)
mydf
##   z
## 1 2

还请参见gtools和Wrapr软件包中的defmacro功能。

2(替代方案可能是使用替换功能:

"incr<-" <- function(x, value) {
      x + value
}
mydf <- data.frame(z = 1)
incr(mydf) <- 1
mydf
##   z
## 1 2

3(或仅覆盖输入:

f2 <- function(x) x + 1
mydf <- data.frame(z = 1)
mydf <- f2(mydf)
mydf
##   z
## 1 2

如果问题是有多个输出,则在GSUBFN软件包中使用list。如图所示,它在带有方括号的分配的左侧使用。请参阅help(list, gsubfn)

library(gsubfn)
f3 <- function(x, y) list(x + 1, y + 2)
mydf <- mydf2 <- data.frame(z = 1)
list[mydf, mydf2] <- f3(mydf, mydf2)
mydf
##   z
## 1 2
mydf2
##   z
## 1 3

至少对于我的特定/有限的需求,我找到了一个解决方案

myVar = 11
myF <- function(x) {
  varName <- deparse(substitute(x))
  # print(paste("var name is", varName))
  x = 99
  assign(varName,x,envir=parent.frame(n = 1))
  NA # sorry this is not a function
  # in real life sometimes you also need procedures
}
myF(myVar)
print(myVar)
# [1] 99

我认为没有办法逐渐仿真。但是,从情况到情况可以使用多种技巧:

Globals:当然,可以具有全局变量而不是参数。这可以使用&lt;&lt; - 而不是= or&lt; - 在函数中写入。这样,许多需要引用呼叫的情况就消失了。

但是,这与并行化不兼容,也与递归不兼容。

当您需要递归时,您可以做得非常相同并具有全球堆栈。在递归调用之前,您必须将其附加到此堆栈中,作为功能的第一行,您可以获取索引(类似于CPU中的堆栈指针(,以写入全局堆栈。

不鼓励两种方法,应用作最后的手段或教育。如果您真的无法避免通过引用呼叫,请使用RCPP转到C ,并编写一个可实现重载的C 功能。如果需要,它实际上可以调用R函数。查看一些RCPP教程,其中大多数涵盖了这种情况...

最新更新