2012-09-02 3 views
1

Je sais que quelque chose de similaire a été demandé avant here on SO, mais la solution donnée ici ne semble pas s'appliquer dans mon cas. J'essaie de suivre la convention en créant un paquet en faisant référence aux fonctions exportées à partir d'autres espaces de noms et en évitant l'utilisation de require() dans une fonction. Essentiellement, j'essaie d'empêcher qu'une fonction prenne trop de temps à fonctionner. Par exemple,Fonction d'accès (exportation) à partir de l'espace de noms

fun <- function(i){ 
require(R.utils) 
setTimeLimit(elapsed=10, transient=TRUE) # prevent taking more than 10secs 
return(i^i) 
} 
>fun(10) 

fonctionne très bien, mais si je tente:

require(R.utils) 
fun <- function(i){ 
R.utils:::setTimeLimit(elapsed=10, transient=TRUE) # prevent taking more than 10secs 
return(i^i) 
} 
>fun(10) 

je reçois:

Error in get(name, envir = asNamespace(pkg), inherits = FALSE) : 
object 'setTimeLimit' not found 

Changer ::: à :: ne change pas ce comportement. Je suis ouvert à toutes les méthodes plus simples pour atteindre le même objectif. Aussi est-il vraiment si mauvais d'avoir require() appels à l'intérieur d'une fonction? Merci beaucoup!

EDIT: Si l'importation fonctionne, merci. Toujours en développement, je voulais donc m'assurer que tout irait bien.

EDIT: Excuses, c'est là dans la base. Je ne sais pas comment j'ai manqué ça; J'utilisais initialement R.utils::evalWithTimeout et devais supposer que les deux étaient dans le même paquet. * Regarde penaud *

+2

Pourquoi ne pas simplement ajouter R.utils à vos importations ? – Dason

+1

Avoir 'require' dans l'appel de la fonction serait une façon de permettre à' R.utils' d'être une dépendance 'suggérer'' et non 'importations'. Jetez un oeil à la façon dont 'ggplot2 ::: fortify.SpatialPolygonsDataFrame' implémente la dépendance de' maptools' et 'gpclib' qui ne sont nécessaires que pour cette (et quelques autres) utilisations spécifiques de ggplot. – mnel

+1

'setTimeLimit' est-il dans le paquet' R.utils'? '" setTimeLimit "% dans% ls (getNamespace (" R.utils "), all.names = TRUE)' est 'FALSE'. Je le vois dans le paquet 'base'. (C'est R 2.15.1) – BenBarnes

Répondre

0

Je poste juste ceci pour empêcher la question d'apparaître comme sans réponse, mais heureux d'accepter une autre ...

isTRUE("setTimeLimit" %in% ls(getNamespace("base"), all.names=TRUE)) 
Questions connexes