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

local_tempfile() fails to close the connection when used in examples with lines= #256

Closed
MichaelChirico opened this issue Jan 25, 2024 · 4 comments

Comments

@MichaelChirico
Copy link
Contributor

As seen in {lintr}:

r-lib/lintr#2519

Here's the smallest example I could make, doesn't feel very minimal. I tried stripping out various parts of the Rd to no avail. I still don't understand what's going wrong.

tools::Rd2ex(
  "https://raw.githubusercontent.com/r-lib/lintr/4299569bd8abf9164e7ff9c6405a00dd17a4a842/man/get_r_string.Rd",
  rd<-tempfile()
)
source(rd, local=new.env())
# Error in file(con, "r") : cannot open the connection
# In addition: Warning message:
# In file(con, "r") :
#   cannot open file '/tmp/RtmpHdp9A4/file331646fd2e9b3': No such file or directory
@lionel-
Copy link
Member

lionel- commented Jan 25, 2024

See the NEWS file, you need to actively set the withr.hook_source option when sourcing outside of the global env.

I would just use local() in that example though.

@MichaelChirico
Copy link
Contributor Author

MichaelChirico commented Jan 25, 2024

I would rather not clutter up package examples with extra nesting/option setting... let me take a look tomorrow at how else to support this use case. We're not failing on CRAN so presumably it's an issue with the CI script.

FWIW I would call out this use case (local_tempfile() inside package examples) in the NEWS, I read that bullet but didn't make the connection because the source() usage is several layers deep.

@lionel-
Copy link
Member

lionel- commented Jan 25, 2024

CRAN is sourcing in the globalenv, which explains why source() works out of the box.

By the way @gaborcsardi let me know that this only works because your example is conditional. If you remove the condition, the generated R code will no longer be fenced by source(), and withr will stop working 100% as expected. The exit handlers will be run after all examples have completed rather than at the end of the particular example withr was used. So local() is definitely still recommended in examples.

@MichaelChirico
Copy link
Contributor Author

Got it, thanks for the elaboration. In that case I will just stick with un-hooked file cleanup, using local() in examples will be confusing for novice readers IMO.

I see two other CRAN packages that may be affected:

https://github.com/search?q=org%3Acran+path%3A.Rd+%2Fwithr%3A%3Alocal_tempfile%5B%28%5D%2F+-repo%3Acran%2Flintr&type=code

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