r中用户定义函数中的逻辑参数

时间:2015-10-17 15:50:07

标签: r user-defined-functions

我试图在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,右=&#39; BOTH&#39;)
  st.pnorm中的错误(19.4,11,8.4,右=&#34; BOTH&#34;):
   对象&#39;两个&#39;找不到

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

2 个答案:

答案 0 :(得分:2)

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在评论中指出的那样,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})  
 }  

!作为非运营商的地方。

答案 1 :(得分:1)

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

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})  
}