@@ -333,29 +333,36 @@ rotate_just <- function(angle, hjust, vjust) {
333
333
list (hjust = hnew , vjust = vnew )
334
334
}
335
335
descent_cache <- new.env(parent = emptyenv())
336
+ # Important: This function is not vectorized. Do not use to look up multiple
337
+ # font descents at once.
336
338
font_descent <- function (family = " " , face = " plain" , size = 12 , cex = 1 ) {
337
339
cur_dev <- names(grDevices :: dev.cur())
340
+ if (cur_dev == " null device" ) {
341
+ cache <- FALSE # don't cache if no device open
342
+ } else {
343
+ cache <- TRUE
344
+ }
338
345
key <- paste0(cur_dev , ' :' , family , ' :' , face , " :" , size , " :" , cex )
339
- descents <- lapply(key , function (k ) {
340
- descent <- descent_cache [[k ]]
341
-
342
- if (is.null(descent )) {
343
- descent <- convertHeight(grobDescent(textGrob(
344
- label = " gjpqyQ" ,
345
- gp = gpar(
346
- fontsize = size ,
347
- cex = cex ,
348
- fontfamily = family ,
349
- fontface = face
350
- )
351
- )), ' inches' )
352
- descent_cache [[k ]] <- descent
346
+ # we only look up the first result; this function is not vectorized
347
+ key <- key [1 ]
348
+
349
+ descent <- descent_cache [[key ]]
350
+
351
+ if (is.null(descent )) {
352
+ descent <- convertHeight(grobDescent(textGrob(
353
+ label = " gjpqyQ" ,
354
+ gp = gpar(
355
+ fontsize = size ,
356
+ cex = cex ,
357
+ fontfamily = family ,
358
+ fontface = face
359
+ )
360
+ )), ' inches' )
361
+
362
+ if (cache ) {
363
+ descent_cache [[key ]] <- descent
353
364
}
354
- descent
355
- })
356
- if (length(descents ) == 1 ) {
357
- descents [[1 ]]
358
- } else {
359
- do.call(unit.c , descents )
360
365
}
366
+
367
+ descent
361
368
}
0 commit comments