我试图在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并不正确,但我想看看在实际编写代码之前我是否可以在结构上使用它。)
答案 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})
}
TRUE
和FALSE
应该用引号括起来,而BOTH
确实需要,因此if (right=="BOTH")
。另外,对于right=TRUE
,您要声明TRUE
的默认值。
<强> 修改 强>
正如@KonradRudolph在评论中指出的那样,if
语句正在检查括号内的内容是否为TRUE
。如果它是TRUE
那么它将会动作,否则它将跳过。因此,当right
接受TRUE
或FALSE
时,上述内容可以重写如下:
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})
}