2

特定の例外に対してメッセージをスローして返す関数が必要です。次に、返されるものが定義済みの「例外」の1つであるかどうかを確認するだけです。たとえば、次の関数があるとします。

divideByX <- function(x){
    # If x is NA throws exception
    if(is.na(x)){
        return(exception('x is NA'))
    }
    # If x is 0 throws exception
    else if(x == 0){
        return(exception('Cannot divide by zero'))
    }
    else{
        return(10/x)
    }
}

したがって、xが0の場合は、「ゼロで除算できません」という期待値を返し、xがNAの場合は、「xはNA」という例外を返し、xの他のすべての値については、式10/xを評価しようとします。

次に、次のようなものを実行したいと思います。

tempList <- list('a' = 2, 'b' = 0, 'c' = 5, 'd' = NA)
lapply(tempList, function(x){
   if(is.exception(x)){
       return(x)
   }
   else{
       y <- divideByX(x)
       return(y^2)
   }
 })

したがって、最初に値が私の定義された例外の1つであるかどうかをチェックし、そうである場合はメッセージを返します。そうでない場合は、値を2乗するので、上記は

$a
[1] 25

$b
[1] 'Cannot divide by zero'

$c
[1] 4

$d
[1] 'x is NA'

誰かがこれを行うための最良の方法を知っていますか?不明な点がありましたらお知らせください。

前もって感謝します

4

2 に答える 2

2

例外を生成する関数を作成します。例外は、単純なエラークラスを拡張する線形階層にすることができます

exception <-
    function(class, msg)
{
    cond <- simpleError(msg)
    class(cond) <- c(class, "MyException", class(cond))
    stop(cond)
}

これがあなたの機能です

divideByX <- function(x){
    # If x is 0 throws exception
    if (length(x) != 1) {
        exception("NonScalar", "x is not length 1")
    } else if (is.na(x)) {
        exception("IsNA", "x is NA")
    } else if (x == 0) {
        exception("DivByZero", "divide by zero")
    }
    10 / x
}

要求した出力を生成するために使用します

lapply(tempList, function(x) tryCatch({
    divideByX(x)
}, MyException=function(err) {
    conditionMessage(err)
}))

または、一部の例外を他の例外とは異なる方法で処理する

> lapply(list(NA, 3:5), function(x) tryCatch({
+     divideByX(x)
+ }, IsNA=function(err) {
+     warning(err)  # signal a warning, return NA
+     NA
+ }, NonScalar=function(err) {
+     stop(err)     # fail
+ }))
Error: x is not length 1
In addition: Warning message:
x is NA 
于 2013-03-26T23:08:34.810 に答える
-1

常に10を除算しているのでない限り、分子をyoru関数に含めたいと思うでしょう。

    divideByX <- function(X, num=10) { 

    if(is.na(X)) 
        return('X is NA')
    if(X == 0) 
        return('Cannot divide by zero')

    return(num / X)
    }

利用方法:

y <- 3
lapply(tempList, divideByX, num=y^2)
#   $a
#   [1] 4.5
#   
#   $b
#   [1] "Cannot divide by zero"
#   
#   $c
#   [1] 1.8
#   
#   $d 
#   [1] "X is NA"
于 2013-03-26T19:08:19.513 に答える