【问题标题】:Passing a function argument with dots用点传递函数参数
【发布时间】:2019-03-25 19:53:48
【问题描述】:

我正在尝试编写一个函数来计算 R 中的样本大小。

该函数使用了几个较小的函数。我想使用点将参数传递给较小的函数。到目前为止,这是我的功能:

log_reg_var<-function(p){
  if(p<=0|p>=1) stop('p must be between 0 and 1')
  var<-1/(p*(1-p))
  return(var)
}

samplesize<-function(method_name, beta, sigma_x, mult_cor, power= 0.8,fpr = 0.05,...){

  if(method_name=='linear regression'){
    var_func <- lin_reg_var
  }
  else if(method_name=='logistic regression'){
    var_func <- log_reg_var
  }
  else if(method_name=='cox regression'){
    var_func <- cox_reg_var
  }
  else if(method_name=='poisson regression'){
    var_func <- pois_reg_var
  }
  else{
    stop('method_name not recognized. method_name accepts one of: "linear regression",
         "logistic regression","cox regression", or "poisson regression"')
  }

  top = (qnorm(1-fpr/2) + qnorm(power))^2
  bottom = (beta*sigma_x)^2*(1-mult_cor)

  n = (top/bottom)*var_func(...)

  return(ceiling(n))

}

我应该可以的

samplesize(method_name = 'logreg',1,1,0,p=0.5)
>>>32

但是我却抛出了以下错误:

Error in var_func(...) : argument "p" is missing, with no default

显然,我通过点传递p 有问题,但我不确定是什么问题。

我的问题是什么?

【问题讨论】:

  • log_reg_var() 函数中的p 应该是power 函数中power 参数中的power
  • 没有。 p 应该被传递给 log_reg_var()power 参数,如果未指定,应为 0.8。清楚吗?

标签: r


【解决方案1】:

您需要添加附加参数p 作为参数,并且需要将其传递给您的log_reg_var() 函数。您还必须小心其他一些语法:

log_reg_var<-function(p){
  if(p<=0|p>=1) stop('p must be between 0 and 1')
  var<-1/(p*(1-p))
  return(var)
}

# specify that you pass a parameter `p`
samplesize<-function(method_name, beta, sigma_x, mult_cor, power= 0.8,fpr = 0.05, p, ...){

# Initialize `var_func` to a NULL value
var_func = NULL

  if(method_name=='linear regression'){
    var_func <- lin_reg_var(p)
  }
  else if(method_name=='logistic regression'){
    # pass parameter `p` into log_reg_var since there is no default
    var_func <- log_reg_var(p)
  }
  else if(method_name=='cox regression'){
    var_func <- cox_reg_var(p)
  }
  else if(method_name=='poisson regression'){
    var_func <- pois_reg_var(p)
  }
  else{
    stop('method_name not recognized. method_name accepts one of: "linear regression",
     "logistic regression","cox regression", or "poisson regression"')
  }

  top = (qnorm(1-fpr/2) + qnorm(power))^2
  bottom = (beta*sigma_x)^2*(1-mult_cor)

  n = (top/bottom)*var_func

  return(ceiling(n))

}

> samplesize(method_name ='logistic regression', 1, 1, 0, p=0.5)
[1] 32

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 2016-08-07
    • 2013-01-27
    • 2021-04-13
    • 2015-10-22
    • 2014-01-24
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多