2015-10-17 55 views
1

我想在r中編寫一個包含三個選項的命名參數的函數。 (我想要做的是在正常曲線的右尾部分,左尾部或兩個尾部找到這個區域)。這可能嗎?我已經提出了這個問題,但是當我用right=BOTH嘗試時出現錯誤。在用戶定義函數中的邏輯參數r

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,右= 'BOTH')
錯誤st.pnorm(19.4,11,8.4,右= 「兩者」):
對象既有」未找到

(我知道X * 2不正確的,但我想看看我是否能得到這個工作,結構之前,我其實寫的代碼。)

+0

'TRUE'不符合邏輯,與TRUE不同,但可強制爲TRUE。同上「錯誤」,但不適用於「兩種」。 –

+0

'identical(「TRUE」,TRUE)#[1] FALSE' –

+0

我認爲你已經對技術問題有了很好的回答。實際上,當你做混合布爾值和字符串等奇怪的事情時,我認爲這是一個很好的指示,可以做不同的事情。你的函數代碼可能更清晰更直接,如果不是''''''''''''''''''''''而不是''''''''''''。孤立地說,'right =「BOTH」'沒有多大意義,它只有在大寫字母的唯一原因是因爲TRUE和FALSE在布爾值時不是字符串而是上限...... – Gregor

回答

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

如果'right'將會是邏輯的,那麼'== TRUE'是多餘的。 if語句檢查邏輯值,如果爲真則繼續。所以'如果(右)返回(..)'和'如果(!右)返回(..'而不是。 –

+0

嗯,我知道,但最好是在答案中詳細說明,而不是簡單地將其刪除。 – amwill04

+1

@ amwill04否,它不是,你永遠存在一個錯誤,你應該糾正它 –

1

您的命名參數有三個選項,表明字符串(如您設置的那樣)是比布爾值更好的方法。調用參數尾部,而不是正確,將使您的意圖更清晰。

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}) 
} 
相關問題