【问题标题】:Logical arguments in user defined functions in rr中用户定义函数中的逻辑参数
【发布时间】:2015-10-17 15:50:07
【问题描述】:

我正在尝试在 r 中编写一个函数,其中包含一个带有三个选项的命名参数。 (我想做的是找到法线曲线右尾、左尾或两条尾的区域。)这可能吗?我想出了这个,但是当我尝试使用 right=BOTH 时出现错误。

st.pnorm<-function(x,µ,ø,right=c('TRUE','FALSE','BOTH')){  
  if (right==FALSE) return({pnorm((x-µ)/ø)})  
  if (right==TRUE) return({1-(pnorm((x-µ)/ø))})  
  if (right==BOTH) return({x*2})  
}   

st.pnorm(19.4,11,8.4,right='BOTH')
st.pnorm(19.4, 11, 8.4, right = "BOTH") 中的错误:
找不到对象“BOTH”

(我知道 x*2 是不正确的,但我想看看在我实际编写该代码之前是否可以让它在结构上工作。)

【问题讨论】:

  • 'TRUE' 不合逻辑,与 TRUE 不同,但可以强制为 TRUE。 'FALSE' 同上,但“BOTH”则不然。
  • identical("TRUE", TRUE) #[1] FALSE
  • 我认为您对技术问题的回答很好。实际上,当你在做一些奇怪的事情时,比如混合布尔值和字符串,我认为这是一个很好的指示,可以用不同的方式来做。如果您将 agument 命名为 tails 而不是 right ,并且它有选项 "left""right""both",那么您的函数代码可能会更清晰、更直接。单独来看,right = "BOTH" 没有多大意义,它使用大写字母的唯一原因是,当布尔值而不是字符串时,TRUE 和 FALSE 是大写字母...
  • 对不起,我来晚了,但这对您有帮助,谢谢!

标签: r user-defined-functions


【解决方案1】:
st.pnorm<-function(x,µ,ø,right=TRUE){  
     if (right==FALSE) return({pnorm((x-µ)/ø)})  
     if (right==TRUE) return({1-(pnorm((x-µ)/ø))})  
     if (right=="BOTH") return({x*2})  
 } 

TRUEFALSE 应该用引号括起来,而BOTH 确实需要,因此if (right=="BOTH")。同样使用right=TRUE,您正在为TRUE 声明一个默认值。

编辑

正如@KonradRudolph 在 cmets 中指出的那样,if 语句正在检查括号内的内容是否为TRUE。如果它是TRUE,那么它将采取行动,否则它将跳过。因此,当right 采用TRUEFALSE 时,上面的内容可以重写为:

st.pnorm<-function(x,µ,ø,right=TRUE){  
     if (!right) return({pnorm((x-µ)/ø)})  
     if (right) return({1-(pnorm((x-µ)/ø))})  
     if (right=="BOTH") return({x*2})  
 }  

! 充当非运算符。

【讨论】:

  • 如果right 是合乎逻辑的,那么==TRUE 是多余的。 if 语句检查逻辑值,如果为真则继续。所以 if (right) return(..)if(!right) return(.. 代替。
  • 嗯,我知道,但最好是详细回答而不是简单地删除它。
  • @amwill04 不,不是。你犯了一个错误,你应该改正它。
  • 这不是一个错误,它可能不是编写代码的最有效方式,但当有人阅读它时它会有意义。
  • @amwill04 这是一个错误,它依赖于对布尔逻辑的错误理解。它碰巧有效,但这并不意味着它不是一个错误。
【解决方案2】:

您的命名参数具有三个选项表明字符串(正如您设置的那样)是比布尔值更好的方法。调用参数tail,而不是right,会让你的意图更清晰。

st.pnorm<-function(x,µ,ø,tail=c('right','left','both')){  
  if (tail=='left') return({pnorm((x-µ)/ø)})  
  if (tail=='right') return({1-(pnorm((x-µ)/ø))})  
  if (tail=='both') return({x*2})  
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多