函数参数中调用另一个函数的参数

3
考虑一个假设的例子:
sim <- function(n,p){
  x <- rbinom(n,1,p)
  y <- (x==0) * rnorm(n)
  z <- (x==1) * rnorm(n,5,2)

  dat <- data.frame(x, y, z)
  return(dat)
}

现在我想编写另一个函数simfun,在该函数中我将调用上述的sim函数,并检查数据框的yz列是否小于一个值k

simfun <- function(n, p, k){
   dat <- sim(n, p)
   dat$threshold <- (dat$y<=k & dat$z<=k)

  return(dat$threshold)
}

但是将 sim 的参数用作 simfun 的参数是标准的吗?我可以写成 simfun <- function(k) 并在 simfun 中调用 sim 函数吗?


你能具体一点吗?定义 simfun 时有出现错误吗?我在你的代码中没有看到任何问题。 - David Leal
为什么不使用“复制(replicate)”函数? - IRTFM
@DavidLeal 没有报错。但是我能否在simfun函数中只有一个参数k,但仍然可以调用sim函数的方法? - time
@42- 这只是一个假设性的例子。如果我提供我的真实函数,会让其他人感到不适。 - time
为什么您没有考虑到n,p在函数simfun(k)之外定义,这样您就可以只使用一个参数调用它。这些值也可以在选项设置中定义。我不明白其中的意义,可能是因为从这样的玩具示例很难推断出您的实际问题。请尝试扩展一下您的假设问题,它不必是您的真实问题。 - David Leal
@DavidLeal 在我的真实问题和假设的例子中,问题是相同的。在我的真实问题中,函数有9个参数。 - time
2个回答

2

我认为在R中这种做法是相当标准的。以下是一些需要考虑的指针:

通常你应该明确声明参数名称,以免在进行更改时产生任何不必要的行为。例如,不要使用 sim(n, p),而是写成 sim(n = n, p = p)

要将 simfun() 简化为只有一个 k 参数,需要为 np 设置默认值。有很多方法可以做到这一点。其中一种方法是在 simfun 内部硬编码。例如:

simfun <- function(k) {
  dat <- sim(n = 100, p = c(.4, .6))
  dat$threshold <- (dat$y<=k & dat$z<=k)

  return(dat$threshold)
}
simfun(.5)

更灵活的方法是在函数声明中添加默认值。这样做时,最好是在没有默认值的变量之后放置具有默认值的变量。因此,k 将首先出现如下:

simfun <- function(k, n = 100, p = c(.4, .6)){
  dat <- sim(n, p)
  dat$threshold <- (dat$y<=k & dat$z<=k)

  return(dat$threshold)
}
simfun(.5)

第二个选项通常更可取,因为如果需要的话,您仍然可以更改 np

如果p=c(.4,.6),那么在x=rbinom(5,1,p)中,x取哪个值的p? Translated text: - time
1
这只是一个例子(因为rbinom()接受p向量)。您可以将其替换为标量,例如p = .4。有关向量的信息,请通过?rbinom查看帮助页面。 - Simon Jackson
哦,我忘了。谢谢。 - time

0

虽然不是很好,但你可以分别定义np

n <- 1
p <- .5

simfun <- function(k){
  dat <- sim(n, p)
  dat$threshold <- (dat$y<=k & dat$z<=k)
return(dat$threshold)
}

您可以在这里阅读更多关于 R 环境的内容:http://adv-r.had.co.nz/Environments.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接