Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用父环境中指定的某些参数调用函数?_R_Eval - Fatal编程技术网

R 如何使用父环境中指定的某些参数调用函数?

R 如何使用父环境中指定的某些参数调用函数?,r,eval,R,Eval,考虑全局环境中定义的以下功能: test <- function(x,y) { x+y } 这是因为函数在列表(y=2)中找不到y。是否有一种简单的方法可以修改我评估它的方式,以便test(1)在定义了y的环境中工作?eval\u with我认为最安全的方法是在未提供的情况下从父帧定义y的默认值 eval_with <- function(fn, ..., stuff = parent.frame()) { args <- list(...) for (arg

考虑全局环境中定义的以下功能:

test <- function(x,y) {
  x+y
}

这是因为函数在
列表(y=2)
中找不到
y
。是否有一种简单的方法可以修改我评估它的方式,以便
test(1)
在定义了
y
的环境中工作?

eval\u with我认为最安全的方法是在未提供的情况下从父帧定义
y
的默认值

eval_with <- function(fn, ..., stuff = parent.frame()) {
  args <- list(...) 
  for (arg in setdiff(intersect(ls(stuff), names(formals(fn))), names(args)))
    args[[arg]] <- stuff[[arg]]
  do.call(fn, args)
}
test<-function(x,y=get("y", envir=parent.frame(1))) {
    x+y
}

y<-3
test(1)
# [1] 4
test(1, 10)
# [1] 11

test可能是这样的吗

在下面的
test()
中,如果参数列表中缺少
y
,函数将在全局环境中查找它,如果找到,则计算
x+y
,否则,它将接受给定的
y
参数并在计算中使用该参数

> y <- 5
> test <- function(x, y) {
      if(missing(y)) y <- get("y", .GlobalEnv)
      x + y
  }
> test(1)      ## 1 + 5
# [1] 6
> test(1, 3)   ## 1 + 3
# [1] 4
>y测试测试(1,3)##1+3
# [1] 4

您的意思是要从
测试定义中删除
y
<代码>测试为什么您指出
y
是函数的一个参数?如果一个值作为
y
传递,您如何知道使用哪一个?函数定义仍然是
test您是否可以定义一个新函数
testx@flodel-有趣。为了向将来的读者澄清,如果函数使用了一个未指定为输入参数的对象,R会在调用(全局?)环境中查找它吗?因此,您可以通过执行:
test间接地传递
y
参数。test同意这是一个糟糕的想法。
test<-function(x,y=get("y", envir=parent.frame(1))) {
    x+y
}

y<-3
test(1)
# [1] 4
test(1, 10)
# [1] 11
> y <- 5
> test <- function(x, y) {
      if(missing(y)) y <- get("y", .GlobalEnv)
      x + y
  }
> test(1)      ## 1 + 5
# [1] 6
> test(1, 3)   ## 1 + 3
# [1] 4