Skip to content

function doesn't exists but still runs.....

5 messages · akshay kulkarni, Bill Dunlap, Greg Snow

#
dear members,
                            I am using the RSelenium package which uses the function selenium() from the wdman package. The selenium function contains the function java_check at line 12. If I try to run it, it throws an error:
Error in java_check() : could not find function "java_check"

Also:
[1] FALSE

But when I run selenium(), it works fine....

How do you explain this conundrum? You can refer to this link: https://github.com/ropensci/wdman/issues/15

Specifically what concept of R explains this weird behaviour?

Thanking you,
Yours sincerely,
AKSHAY M KULKARNI
#
Look into R's scoping rules.  E.g.,
https://bookdown.org/rdpeng/rprogdatascience/scoping-rules-of-r.html.

* When a function looks up a name, it looks it up in the environment in
which the function was defined.
* Functions in a package are generally defined in the package's environment
(although sometimes they are in a descendent of the parent's environment).
* When one searches an environment for a name, if it is not found in the
environment the search continues in the parent environment of that
environment, recursively until the parent environment is the empty
environment.
function ()
{
    javapath <- Sys.which("java")
    if (identical(unname(javapath), "")) {
        stop("PATH to JAVA not found. Please check JAVA is installed.")
    }
    javapath
}
<bytecode: 0x000001fd0ab826a8>
<environment: namespace:wdman>

-Bill

On Thu, Jan 19, 2023 at 2:28 PM akshay kulkarni <akshay_e4 at hotmail.com>
wrote:

  
  
#
A little simpler answer than the others.

Look at package Namespaces.  When a package is created, the NAMESPACE
file defines which functions in the package are exported (i.e.
available for you to use), the other functions are "private" to the
package meaning that other functions in the package can call those
functions, but they are not meant to be called directly by the user.

So in your case, the `selenium` function was exported, but
`java_check` was not exported.  The function does exist, but R's
regular search rules do not find it when you try to call it directly
(but because it shares the Namespace with selenium, it is found when
called there).

It is possible to call non-exported functions (use something like
RSelenium:::java_check()), but non-exported functions are not usually
documented and subject to change without any warning.  You are using
the functionality in a way different from how the author intended, so
there are no guarantees that it will do what you think it should.
On Thu, Jan 19, 2023 at 3:28 PM akshay kulkarni <akshay_e4 at hotmail.com> wrote:

  
    
#
Dear Greg,
                  THanks for a very well pointed answer.....

THanking you,
yours sincerely
AKSHAY M KULKARNI
#
Dear Bill,
                Thanks for your reply...If I run selenium() in debug mode,  java_check() should work inside of selenium(), right?
Any other points to be considered when running selenium() in debug mode?

THanking you,
yours sincerely
AKSHAY M KULKARNI