2012-12-04 63 views
2

我如何可以編寫一個函數由兩個 測試,以檢查的情況下(X,Y):如何編寫這樣的測試函數?

一個

if y==rank(y) 

兩個

xranks <- rank(x) 
yranks <- rank(y) 
meanx <- mean(xranks) 
meany <- mean(yranks) 
covariance.term <- cov(xranks-meanx,y-meany) 
sd.x <- sd(xranks) 
sd.y <- sd(yranks) 
if -1<= covariance.term/(sd.x*sd.y) <=1 

,而應返回TRUE如果兩個測試通過,或FALSE,並警告哪些測試失敗。

回答

1

下面應該做你想做的事情,但是因爲你沒有提供測試用例,我不確定它是否有效。

check.xy <- function(x,y) { 
    xranks <- rank(x) 
    yranks <- rank(y) 
    meanx <- mean(xranks) 
    meany <- mean(yranks) 
    covariance.term <- cov(xranks-meanx,y-meany) 
    sd.x <- sd(xranks) 
    sd.y <- sd(yranks) 
    testA <- all(y == rank(y)) 
    testB <- all(-1 <= covariance.term/(sd.x*sd.y) & covariance.term/(sd.x*sd.y) <=1) 
    if (testA & testB) return(TRUE) 
    else if (testA) warning("test two failed") 
    else if (testB) warning("test one failed") 
    else warning("tests one and two failed") 
    FALSE 
} 
+0

感謝Henrik,它的工作原理。但返回另一個警告消息,如果(testA&testB)返回(TRUE)否則如果(testA)警告(「測試兩個失敗」)否則如果(testB)警告(「測試一個失敗」)其他警告(「測試一個和兩個失敗「)條件長度> 1,只有第一個元素將用任何方式來解決? – RandyHuang

+0

@RandyHuang請參閱我的編輯。將測試包裝在'all()'中的更改應確保測試與'y'的所有元素匹配(我也確保測試2返回單個值,但這似乎是不必要的)。 – Henrik

0

我認爲要在單個函數中定義每個測試,尤其是我們需要警告哪些測試失敗。

2個測試共享相同的環境,爲什麼我將它們定義爲嵌套函數。

multitest <- function(x,y){ 
test.covariance <- function(){ 
    xranks <- rank(x) 
    yranks <- rank(y) 
    meanx <- mean(xranks) 
    meany <- mean(yranks) 
    covariance.term <- cov(xranks-meanx,y-meany) 
    sd.x <- sd(xranks) 
    sd.y <- sd(yranks) 
    cov.norm <- covariance.term/(sd.x*sd.y) 
    res <- cov.norm > -1 && cov.norm < 1 
    if(is.na(res) || res > 0) warning('test covariance range failed',.call = FALSE) 
    res 
} 
test.rank <- function(){ 
    res <- all(y==rank(y)) 
    if(!res) warning('test rank failed') 
    res 
} 
res <- test.covariance() && test.rank() 
!is.na(res) 
} 

一些測試:

成功

x <- 1:10 
y <- 1:10 
multitest(x,y) 
[1] TRUE 

失敗等級

x <- rnorm(10) 
y <- rnorm(10) 
multitest(x,y) 
[1] FALSE 
Warning message: 
In test.rank() : test rank failed 

失敗協方差

x <- rep(10,10) 
y <- 1:10 
multitest(x,y) 
[1] FALSE 
Warning message: 
In test.covariance() : test covariance range failed 
相關問題