In package A I have askForString(), which asks the user for a string. Also in package A I have defined ssh(), which calls askForString(). Package B has package A as a prerequisite. In package B I redefine askForString() to take advantage of a nicer user interface made available by B, namely the Emacs mini-buffer prompt. Packages B and A are both on the search path, with B ahead of A. If I call askForString() at the command prompt, I get the version from B. But the version used by ssh() depends on whether or not package A has a namespace. If so, ssh() (defined in A) always uses the A version of askForString(). How can I get ssh() to use the B version of askForString()? Or am I going about this all wrong? Jeff
On 2/12/2007 1:13 PM, jhallman at frb.gov wrote:> In package A I have askForString(), which asks the user for a string. > Also in package A I have defined ssh(), which calls askForString(). > > Package B has package A as a prerequisite. > > In package B I redefine askForString() to take advantage of a nicer user > interface made available by B, namely the Emacs mini-buffer prompt. > > Packages B and A are both on the search path, with B ahead of A. If I > call askForString() at the command prompt, I get the version from B. > But the version used by ssh() depends on whether or not package A has a > namespace. If so, ssh() (defined in A) always uses the A version of > askForString(). How can I get ssh() to use the B version of > askForString()? Or am I going about this all wrong?There are several ways. If package A "knows" that some users will want to replace askForString(), then it should allow the user to tell it what to use for that function, and fall back to its own definition as a default. It could do this by explicitly looking for askForString in the global environment (which will fall back to the search list if not found), or it could get the function from an option() setting, etc. If package A doesn't expect askForString() to be changed, then you shouldn't change it: you might break something else in A. You should write to the author of A (which sounds as though it's yourself), and ask for some improvements to the package. There are dirty methods to modify the contents of a namespace, but you shouldn't use those. Duncan Murdoch
On Mon, 12 Feb 2007, jhallman at frb.gov wrote:> In package A I have askForString(), which asks the user for a string. > Also in package A I have defined ssh(), which calls askForString(). > > Package B has package A as a prerequisite. > > In package B I redefine askForString() to take advantage of a nicer user > interface made available by B, namely the Emacs mini-buffer prompt. > > Packages B and A are both on the search path, with B ahead of A. If I > call askForString() at the command prompt, I get the version from B. > But the version used by ssh() depends on whether or not package A has a > namespace. If so, ssh() (defined in A) always uses the A version of > askForString(). How can I get ssh() to use the B version of > askForString()? Or am I going about this all wrong?That is one of the main purposes of a namespace, but you can defeat it. In the scenario you paint, B::askForString() should work (whether or not B has a namespace). If (I am guessing) you want the version that would be gotten at the top level (the > prompt) whether or not B is in use, use get("askForString", pos=1)(). -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595
Prof Ripley, Thanks to both you and Duncan Murdoch, who replied with similar advice. Your suggestion to use get("askForString", pos = 1)() in my ssh() function does what I want whether package B is attached or not. Jeff Prof Brian Ripley <ripley at stats.ox.ac.uk> wrote: br> On Mon, 12 Feb 2007, jhallman at frb.gov wrote: >> In package A I have askForString(), which asks the user for a string. >> Also in package A I have defined ssh(), which calls askForString(). >> >> Package B has package A as a prerequisite. >> >> In package B I redefine askForString() to take advantage of a nicer user >> interface made available by B, namely the Emacs mini-buffer prompt. >> >> Packages B and A are both on the search path, with B ahead of A. If I >> call askForString() at the command prompt, I get the version from B. >> But the version used by ssh() depends on whether or not package A has a >> namespace. If so, ssh() (defined in A) always uses the A version of >> askForString(). How can I get ssh() to use the B version of >> askForString()? Or am I going about this all wrong? br> That is one of the main purposes of a namespace, but you can defeat it. br> In the scenario you paint, B::askForString() should work (whether or not B has br> a namespace). br> If (I am guessing) you want the version that would be gotten at the top level br> (the > prompt) whether or not B is in use, use br> get("askForString", pos=1)().