-
Notifications
You must be signed in to change notification settings - Fork 151
Speed up is_installed()
- shortcut when package is already loaded
#1804
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @eitsupi looks good to me!
if (is.null(version)) { | ||
loaded <- lapply(pkg, function(x) { | ||
is.character(x) && nzchar(x) && is.environment(.getNamespace(x)) | ||
}) | ||
if (all(as.logical(loaded))) { | ||
return(TRUE) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this a typical intended interface? is_installed(list("dplyr", "dbplyr"))
If not, we can move the checks "outside the loop" toget early exits for any of the !is.character(pkg)
and !all(nzchar(pkg))
cases.
Next, why use is.environment(.getNamespace(x))
instead of isNamespaceLoaded(x)
? The former is described as an "internal" (hence the leading .
), the latter is more readable (and nanosecond-scale-faster).
if (is.null(version)) { | |
loaded <- lapply(pkg, function(x) { | |
is.character(x) && nzchar(x) && is.environment(.getNamespace(x)) | |
}) | |
if (all(as.logical(loaded))) { | |
return(TRUE) | |
} | |
} | |
if (is.null(version) && is.character(pkg) && all(nzchar(pkg)) && all(vapply(pkg, isNamespaceLoaded, NA))) { | |
return(TRUE) | |
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The argument is expected to be a character vector c("dplyr", "dbplyr")
rather than a list, so your suggestion would work well in that case. A list would just fail the fast path but continue, so is not disastrous.
If we make the change here, we should do the same at check_installed()
.
Thanks for the suggestion of isNamespaceLoaded(x)
. It is indeed faster as it shares the same C level code path as .getNamespace(x)
but just returns a logical value rather than the environment itself.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@MichaelChirico sorry somehow I missed your entire code suggestion, so my inital reply was totally off the mark (now amended above).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the suggestions!
Would it be better to refactor this with check_installed
after merging this since my intention of this PR is just to bring the same changes here as check_installed
in #1780?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes that's fine thanks! If Lionel adopts the suggestion here, I will follow up with the corresponding change to check_installed()
.
Same as #1780