From 9593da131ecf1d2efd2addad8ea5f695476576f8 Mon Sep 17 00:00:00 2001 From: "Aaron A. King" Date: Wed, 11 Dec 2024 10:14:20 -0500 Subject: [PATCH] better error catch for bad arguments --- DESCRIPTION | 4 ++-- R/pomp.R | 30 +++++++++++++++++------------- tests/issue222.Rout.save | 3 +-- tests/kalman.Rout.save | 4 ++-- tests/mif2.Rout.save | 5 +++-- tests/userdata.R | 4 ++++ tests/userdata.Rout.save | 12 ++++++++++++ 7 files changed, 41 insertions(+), 21 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 10e02bb8..2e772c4c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: pomp Type: Package Title: Statistical Inference for Partially Observed Markov Processes -Version: 6.0.1.0 -Date: 2024-12-08 +Version: 6.0.1.1 +Date: 2024-12-11 Authors@R: c(person(given=c("Aaron","A."),family="King",role=c("aut","cre"),email="kingaa@umich.edu",comment=c(ORCID="0000-0001-6159-3207")), person(given=c("Edward","L."),family="Ionides",role="aut",comment=c(ORCID="0000-0002-4190-0174")) , person(given="Carles",family="Bretó",role="aut",comment=c(ORCID="0000-0003-4695-4902")), diff --git a/R/pomp.R b/R/pomp.R index ed887cde..d9749b18 100644 --- a/R/pomp.R +++ b/R/pomp.R @@ -187,11 +187,27 @@ pomp <- function ( ) return(as(data,"pomp")) + extra_args <- list(...) + if (length(extra_args)>0L) { + nm <- names(extra_args) + if (length(nm)==0 || any(nchar(nm)==0)) + pStop_("Unnamed arguments are not permitted.") + else + pStop_("The ", + ngettext(length(extra_args),"argument ","arguments "), + paste(sQuote(nm),collapse=","), + ngettext(length(extra_args)," is"," are"), + " not recognized.\nUse the ",sQuote("userdata"), + " argument to supply extra objects to basic model components.\n", + "See ",sQuote("?userdata"),"." + ) + } + if (missing(times)) times <- NULL tryCatch( construct_pomp( - data=data,times=times,t0=t0,..., + data=data,times=times,t0=t0, rinit=rinit,dinit=dinit, rprocess=rprocess,dprocess=dprocess, rmeasure=rmeasure,dmeasure=dmeasure, @@ -450,7 +466,6 @@ setMethod( pomp_internal <- function ( data, - ..., times, t0, timename, rinit, dinit, rprocess, dprocess, rmeasure, dmeasure, emeasure, vmeasure, @@ -482,17 +497,6 @@ pomp_internal <- function ( else timename <- as.character(timename) - added.userdata <- list(...) - if (length(added.userdata)>0L) { - pStop_("The ", - ngettext(length(added.userdata),"argument","arguments")," ", - paste(sQuote(names(added.userdata)),collapse=","), - ngettext(length(added.userdata),"is","are"), - " not recognized.\nUse the ",sQuote("userdata"), - " argument to supply extra objects to basic model components.", - " See ",sQuote("?userdata"),"." - ) - } .userdata[names(userdata)] <- userdata if (!is(rprocess,"rprocPlugin")) { diff --git a/tests/issue222.Rout.save b/tests/issue222.Rout.save index 41ced155..946c502c 100644 --- a/tests/issue222.Rout.save +++ b/tests/issue222.Rout.save @@ -103,8 +103,7 @@ Error : in 'simulate': argument is missing, with no default + ) + ) + ) -Error : in 'simulate': The argument is not recognized. -Use the 'userdata' argument to supply extra objects to basic model components. See '?userdata'. +Error : in 'simulate': Unnamed arguments are not permitted. > > dev.off() null device diff --git a/tests/kalman.Rout.save b/tests/kalman.Rout.save index 3375f5df..0b205966 100644 --- a/tests/kalman.Rout.save +++ b/tests/kalman.Rout.save @@ -134,7 +134,7 @@ Error : in 'enkf': 'Np' should be a single positive integer. > try(enkf(pf,Np="10b")) Error : in 'enkf': 'Np' should be a single positive integer. In addition: Warning message: -In enkf_internal(data, Np = Np, ..., verbose = verbose) : +In enkf_internal(data, ..., Np = Np, verbose = verbose) : NAs introduced by coercion > try(enkf(pf,Np=100,emeasure=NULL)) Error : in 'enkf': 'emeasure' is a needed basic component. @@ -164,7 +164,7 @@ Error : in 'eakf': 'Np' should be a single positive integer. > try(eakf(enkf,Np="10b")) Error : in 'eakf': 'Np' should be a single positive integer. In addition: Warning message: -In eakf_internal(data, Np = Np, ..., verbose = verbose) : +In eakf_internal(data, ..., Np = Np, verbose = verbose) : NAs introduced by coercion > try(eakf(enkf,Np=100,emeasure=NULL)) Error : in 'eakf': 'emeasure' is a needed basic component. diff --git a/tests/mif2.Rout.save b/tests/mif2.Rout.save index a6f1cd7d..81c1744e 100644 --- a/tests/mif2.Rout.save +++ b/tests/mif2.Rout.save @@ -185,8 +185,9 @@ loglik: NA + drpocess="oops", + dmeasure=function(log,...)0) -> mf3 + ) -Error : in 'mif2': The argument 'drpocess'is not recognized. -Use the 'userdata' argument to supply extra objects to basic model components. See '?userdata'. +Error : in 'mif2': The argument 'drpocess' is not recognized. +Use the 'userdata' argument to supply extra objects to basic model components. +See '?userdata'. > mif2(po,Nmif=2,Np=50,rw.sd=rw_sd(sigma=0.01), + cooling.type="hyper",cooling.fraction.50=0.1, + dmeasure=function(log,...)0) -> mf3 diff --git a/tests/userdata.R b/tests/userdata.R index c91689a2..30caedd9 100644 --- a/tests/userdata.R +++ b/tests/userdata.R @@ -39,6 +39,10 @@ try(po |> SEXP Msg = get_userdata("bob"); char *msg = CHAR(STRING_ELT(Msg,0)); Rprintf("%s\n",msg);}")))) +try(po |> simulate(time=1:3)) +try(po |> simulate(time=1:3,bob=77)) +try(po |> simulate(times=1:3,seed=NULL,nsim=5,77)) +try(po |> pomp(77)) try(po |> simulate(rprocess=onestep( Csnippet(r"{double nbasis = *(get_userdata_double("nbasis"));}")))) diff --git a/tests/userdata.Rout.save b/tests/userdata.Rout.save index 7e2b0b3d..db3d0e5f 100644 --- a/tests/userdata.Rout.save +++ b/tests/userdata.Rout.save @@ -60,6 +60,18 @@ hello! + char *msg = CHAR(STRING_ELT(Msg,0)); + Rprintf("%s\n",msg);}")))) Error : in 'simulate': no user-data element 'bob' is found. +> try(po |> simulate(time=1:3)) +Error : in 'simulate': The argument 'time' is not recognized. +Use the 'userdata' argument to supply extra objects to basic model components. +See '?userdata'. +> try(po |> simulate(time=1:3,bob=77)) +Error : in 'simulate': The arguments 'time','bob' are not recognized. +Use the 'userdata' argument to supply extra objects to basic model components. +See '?userdata'. +> try(po |> simulate(times=1:3,seed=NULL,nsim=5,77)) +Error : in 'simulate': Unnamed arguments are not permitted. +> try(po |> pomp(77)) +Error : Unnamed arguments are not permitted. > try(po |> + simulate(rprocess=onestep( + Csnippet(r"{double nbasis = *(get_userdata_double("nbasis"));}"))))