Skip to content
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

Error in match.call: ... used in a situation where it does not exist #42

Closed
bersbersbers opened this issue Oct 8, 2020 · 4 comments
Closed

Comments

@bersbersbers
Copy link

bersbersbers commented Oct 8, 2020

For convenience, I am trying to do

save_enc_rds <- function(...) {
    cyphr::encrypt(saveRDS(...), key)
}

However, this fails with

Error in match.call(defn, expr, expand.dots = TRUE) :
... used in a situation where it does not exist

I feel this may due to the use of substitute here (but this may be wrong):

encrypt <- function(expr, key, file_arg = NULL, envir = parent.frame()) {
encrypt_(substitute(expr), key, file_arg, envir)
}

How can I get the kind of function wrapper I am looking for?

@richfitz
Copy link
Member

Use the encrypt_ version directly and construct the call yourself (e.g., using rlang's tools or substitute yourself), or by using the less "helpful" cyphr functions such as encrypt_data

@bersbersbers
Copy link
Author

Thanks - relying on undocumented/internal functions such as encrypt_ is nothing I like to do, unfortunately.

I ended up using

save_enc_rds <- function(object, file) {
    cyphr::encrypt(saveRDS(object, file), key)
}

which is enough for my use case. I'll have to add additional arguments as needed, but that API is probably stable enough.

@richfitz
Copy link
Member

richfitz commented May 24, 2021

The encrypt_ functions are neither undocumented nor internal and are part of the package API.

One possible way of using them would be to do:

save_enc_rds <- function(...) {
  ## The 'rlang' package provides other ways of doing this
  envir <- parent.frame()
  call <- sys.call()
  call[[1L]] <- quote(saveRDS)
  ## Following your example, with 'key' found in the global
  ## environment; I'd recommend doing something more robust here
  ## personally.
  cyphr::encrypt_(call, key, envir = envir)
}

then use as:

key <- cyphr::key_sodium(sodium::keygen())
obj <- runif(10)
path <- tempfile(fileext = ".rds")
save_enc_rds(obj, path, compress = FALSE, version = 3) # note extra args
cyphr::decrypt(readRDS(path), key)

However, much simpler would be to use cyphr::encrypt_object directly, unless you really need to pass more arguments into the serialiser.

path <- tempfile(fileext = ".rds")
cyphr::encrypt_object(obj, key, path)
cyphr::decrypt_object(path, key)

@bersbersbers
Copy link
Author

bersbersbers commented May 24, 2021

Ah, I see. I was under that false impression due the similarity with Python's _single_leading_underscore. In that process, I also learned about single_trailing_underscore_, which is quite a different concept :)

So that looks very useful then, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants