Allowing nulls to be passed through tryCatch












0















I have a simple function that checks whether two supplied arguments are characters, and if not, throws an error



check_args_are_chr <- function(arg1, arg2){
tryCatch({
stopifnot(is.character(arg1), is.character(arg2))},
error = function(e) stop("Arguments must be supplied as characters"))

}

check_args_are_chr("one", 2)
> Error in value[[3L]](cond) : Arguments must be supplied as characters


However, arg2 is an optional argument which isn't always passed into the function. NULL is also an acceptable value



I wanted to incorporate it so the expr passed to stopifnot was



is.character(arg2) && is.null(arg2)



check_args_are_chr <- function(arg1, arg2){
tryCatch({
stopifnot(is.character(arg1), is.character(arg2) && is.null(arg2))},
error = function(e) stop("Arguments must be supplied as characters"))

}


But this still makes the tryCatch throw an exception. How can I modify this so that acceptable classes are character or NULL










share|improve this question




















  • 1





    Simple: you cannot have both is.character and is.null return TRUE. Use logical ||, not &&.

    – Rui Barradas
    Nov 25 '18 at 21:30













  • Ugh, not sure why I couldn't see that. Cheers

    – Conor Neilson
    Nov 25 '18 at 21:35
















0















I have a simple function that checks whether two supplied arguments are characters, and if not, throws an error



check_args_are_chr <- function(arg1, arg2){
tryCatch({
stopifnot(is.character(arg1), is.character(arg2))},
error = function(e) stop("Arguments must be supplied as characters"))

}

check_args_are_chr("one", 2)
> Error in value[[3L]](cond) : Arguments must be supplied as characters


However, arg2 is an optional argument which isn't always passed into the function. NULL is also an acceptable value



I wanted to incorporate it so the expr passed to stopifnot was



is.character(arg2) && is.null(arg2)



check_args_are_chr <- function(arg1, arg2){
tryCatch({
stopifnot(is.character(arg1), is.character(arg2) && is.null(arg2))},
error = function(e) stop("Arguments must be supplied as characters"))

}


But this still makes the tryCatch throw an exception. How can I modify this so that acceptable classes are character or NULL










share|improve this question




















  • 1





    Simple: you cannot have both is.character and is.null return TRUE. Use logical ||, not &&.

    – Rui Barradas
    Nov 25 '18 at 21:30













  • Ugh, not sure why I couldn't see that. Cheers

    – Conor Neilson
    Nov 25 '18 at 21:35














0












0








0








I have a simple function that checks whether two supplied arguments are characters, and if not, throws an error



check_args_are_chr <- function(arg1, arg2){
tryCatch({
stopifnot(is.character(arg1), is.character(arg2))},
error = function(e) stop("Arguments must be supplied as characters"))

}

check_args_are_chr("one", 2)
> Error in value[[3L]](cond) : Arguments must be supplied as characters


However, arg2 is an optional argument which isn't always passed into the function. NULL is also an acceptable value



I wanted to incorporate it so the expr passed to stopifnot was



is.character(arg2) && is.null(arg2)



check_args_are_chr <- function(arg1, arg2){
tryCatch({
stopifnot(is.character(arg1), is.character(arg2) && is.null(arg2))},
error = function(e) stop("Arguments must be supplied as characters"))

}


But this still makes the tryCatch throw an exception. How can I modify this so that acceptable classes are character or NULL










share|improve this question
















I have a simple function that checks whether two supplied arguments are characters, and if not, throws an error



check_args_are_chr <- function(arg1, arg2){
tryCatch({
stopifnot(is.character(arg1), is.character(arg2))},
error = function(e) stop("Arguments must be supplied as characters"))

}

check_args_are_chr("one", 2)
> Error in value[[3L]](cond) : Arguments must be supplied as characters


However, arg2 is an optional argument which isn't always passed into the function. NULL is also an acceptable value



I wanted to incorporate it so the expr passed to stopifnot was



is.character(arg2) && is.null(arg2)



check_args_are_chr <- function(arg1, arg2){
tryCatch({
stopifnot(is.character(arg1), is.character(arg2) && is.null(arg2))},
error = function(e) stop("Arguments must be supplied as characters"))

}


But this still makes the tryCatch throw an exception. How can I modify this so that acceptable classes are character or NULL







r try-catch






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 26 '18 at 6:29









DTYK

7081220




7081220










asked Nov 25 '18 at 21:15









Conor NeilsonConor Neilson

460515




460515








  • 1





    Simple: you cannot have both is.character and is.null return TRUE. Use logical ||, not &&.

    – Rui Barradas
    Nov 25 '18 at 21:30













  • Ugh, not sure why I couldn't see that. Cheers

    – Conor Neilson
    Nov 25 '18 at 21:35














  • 1





    Simple: you cannot have both is.character and is.null return TRUE. Use logical ||, not &&.

    – Rui Barradas
    Nov 25 '18 at 21:30













  • Ugh, not sure why I couldn't see that. Cheers

    – Conor Neilson
    Nov 25 '18 at 21:35








1




1





Simple: you cannot have both is.character and is.null return TRUE. Use logical ||, not &&.

– Rui Barradas
Nov 25 '18 at 21:30







Simple: you cannot have both is.character and is.null return TRUE. Use logical ||, not &&.

– Rui Barradas
Nov 25 '18 at 21:30















Ugh, not sure why I couldn't see that. Cheers

– Conor Neilson
Nov 25 '18 at 21:35





Ugh, not sure why I couldn't see that. Cheers

– Conor Neilson
Nov 25 '18 at 21:35












2 Answers
2






active

oldest

votes


















1














First your code doesn't work as expected because you are confusing (binary) or || with and &&



Second, using tryCatch this way doesn't really make sense imho. Just do if (...) stop("Arguments must be supplied as characters"). On the downside the if statement is more awkward this way, but less awkward than using tryCatch.






share|improve this answer
























  • Yep, swapping to || worked great, thanks.

    – Conor Neilson
    Nov 25 '18 at 21:40











  • Yes, in this context tryCatch doesn't make much sense. It's because I'm trimming down to a minimal example. The full function contains more code that makes tryCatch more useful, but I just wanted to make sure I got an answer that works with the functions context

    – Conor Neilson
    Nov 25 '18 at 21:41



















0














Either use missing to check whether arg2 was given:



 (missing(arg2) || (is.null(arg2) || is.character(arg2)))


or set a default value arg2 = NULL






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53472045%2fallowing-nulls-to-be-passed-through-trycatch%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    First your code doesn't work as expected because you are confusing (binary) or || with and &&



    Second, using tryCatch this way doesn't really make sense imho. Just do if (...) stop("Arguments must be supplied as characters"). On the downside the if statement is more awkward this way, but less awkward than using tryCatch.






    share|improve this answer
























    • Yep, swapping to || worked great, thanks.

      – Conor Neilson
      Nov 25 '18 at 21:40











    • Yes, in this context tryCatch doesn't make much sense. It's because I'm trimming down to a minimal example. The full function contains more code that makes tryCatch more useful, but I just wanted to make sure I got an answer that works with the functions context

      – Conor Neilson
      Nov 25 '18 at 21:41
















    1














    First your code doesn't work as expected because you are confusing (binary) or || with and &&



    Second, using tryCatch this way doesn't really make sense imho. Just do if (...) stop("Arguments must be supplied as characters"). On the downside the if statement is more awkward this way, but less awkward than using tryCatch.






    share|improve this answer
























    • Yep, swapping to || worked great, thanks.

      – Conor Neilson
      Nov 25 '18 at 21:40











    • Yes, in this context tryCatch doesn't make much sense. It's because I'm trimming down to a minimal example. The full function contains more code that makes tryCatch more useful, but I just wanted to make sure I got an answer that works with the functions context

      – Conor Neilson
      Nov 25 '18 at 21:41














    1












    1








    1







    First your code doesn't work as expected because you are confusing (binary) or || with and &&



    Second, using tryCatch this way doesn't really make sense imho. Just do if (...) stop("Arguments must be supplied as characters"). On the downside the if statement is more awkward this way, but less awkward than using tryCatch.






    share|improve this answer













    First your code doesn't work as expected because you are confusing (binary) or || with and &&



    Second, using tryCatch this way doesn't really make sense imho. Just do if (...) stop("Arguments must be supplied as characters"). On the downside the if statement is more awkward this way, but less awkward than using tryCatch.







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 25 '18 at 21:37









    Stefan FStefan F

    7811613




    7811613













    • Yep, swapping to || worked great, thanks.

      – Conor Neilson
      Nov 25 '18 at 21:40











    • Yes, in this context tryCatch doesn't make much sense. It's because I'm trimming down to a minimal example. The full function contains more code that makes tryCatch more useful, but I just wanted to make sure I got an answer that works with the functions context

      – Conor Neilson
      Nov 25 '18 at 21:41



















    • Yep, swapping to || worked great, thanks.

      – Conor Neilson
      Nov 25 '18 at 21:40











    • Yes, in this context tryCatch doesn't make much sense. It's because I'm trimming down to a minimal example. The full function contains more code that makes tryCatch more useful, but I just wanted to make sure I got an answer that works with the functions context

      – Conor Neilson
      Nov 25 '18 at 21:41

















    Yep, swapping to || worked great, thanks.

    – Conor Neilson
    Nov 25 '18 at 21:40





    Yep, swapping to || worked great, thanks.

    – Conor Neilson
    Nov 25 '18 at 21:40













    Yes, in this context tryCatch doesn't make much sense. It's because I'm trimming down to a minimal example. The full function contains more code that makes tryCatch more useful, but I just wanted to make sure I got an answer that works with the functions context

    – Conor Neilson
    Nov 25 '18 at 21:41





    Yes, in this context tryCatch doesn't make much sense. It's because I'm trimming down to a minimal example. The full function contains more code that makes tryCatch more useful, but I just wanted to make sure I got an answer that works with the functions context

    – Conor Neilson
    Nov 25 '18 at 21:41













    0














    Either use missing to check whether arg2 was given:



     (missing(arg2) || (is.null(arg2) || is.character(arg2)))


    or set a default value arg2 = NULL






    share|improve this answer




























      0














      Either use missing to check whether arg2 was given:



       (missing(arg2) || (is.null(arg2) || is.character(arg2)))


      or set a default value arg2 = NULL






      share|improve this answer


























        0












        0








        0







        Either use missing to check whether arg2 was given:



         (missing(arg2) || (is.null(arg2) || is.character(arg2)))


        or set a default value arg2 = NULL






        share|improve this answer













        Either use missing to check whether arg2 was given:



         (missing(arg2) || (is.null(arg2) || is.character(arg2)))


        or set a default value arg2 = NULL







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 25 '18 at 21:34









        Kamil BartońKamil Bartoń

        1,12469




        1,12469






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53472045%2fallowing-nulls-to-be-passed-through-trycatch%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Wiesbaden

            Marschland

            Dieringhausen