PowerBI R 脚本运行时错误,从 rlang 0.3.0 开始不推荐使用 rlang 命名空间作为前缀 UQ()

PowerBI R Script Runtime Error,Prefixing UQ() with the rlang namespace is deprecated as of rlang 0.3.0

下面是需要粘贴到 PowerBI R 脚本可视化中的可重现代码。 我正在对默认 process_map object.

进行一些自定义

视觉效果在我当前的桌面上有效,但在发布到 PowerBI Web 时出现错误。

# The following code to create a dataframe and remove duplicated rows is always executed and acts as a preamble for your script: 

# dataset <- data.frame(Column1)
# dataset <- unique(dataset)

# Paste or type your script code here:
library(bupaR)
library(DiagrammeR)
library(tidyverse)
library(lubridate)


# convert to proper date


processMap <- patients %>%
  process_map(sec = performance(median, "hours")
              ,type = frequency("relative_case")
              ,type_edges = frequency("absolute_case")
              ,rankdir = "LR"
              ,layout = layout_pm(edge_weight = TRUE)
              ,fixed_edge_width = F
              ,render = F
  )

# customisation(label, color, font)
processMap$nodes_df$label <- stringr::str_replace_all(processMap$nodes_df$label, c('ARTIFICIAL_START' = 'Start', 'ARTIFICIAL_END' = 'End'))
processMap$nodes_df$color <- stringr::str_replace_all(processMap$nodes_df$color, c('chartreuse4' = '#769e00', 'brown4' = '#7a0f2d'))
processMap$nodes_df$fontcolor <- stringr::str_replace_all(processMap$nodes_df$fontcolor, c('chartreuse4' = '#769e00', 'brown4' = '#7a0f2d'))
processMap$nodes_df$fontname <- stringr::str_replace_all(processMap$nodes_df$fontname, c('Arial' = 'Calibri'))
processMap$edges_df$fontname <- stringr::str_replace_all(processMap$edges_df$fontname, c('Arial' = 'Calibri'))
# change edge with
processMap$edges_df$penwidth <- scales::rescale(processMap$edges_df$penwidth, to = c(0.5, 4)) 

# custom duration edges
edges_label <- processMap$edges_df$label
tmp <- regmatches(edges_label, gregexpr("\(.*?\)", edges_label))
tmp <- gsub("[\(\)]", "", tmp)
tmp <- stringr::str_replace_all(tmp, c('character0' = '0', ' hours'=''))
tmp <- as.numeric(tmp)*60*60
tmp <- lubridate::as.duration(tmp)
tmp <- regmatches(tmp, gregexpr("\(.*?\)", tmp))
tmp <- gsub("[\(\)]", "", tmp)
edges_label_duration <- stringr::str_replace_all(tmp, c('character0' = '<1 hour'))
edges_label_count_absolute_case <- gsub("\n.*","",edges_label)
edges_label_clean <- paste0(edges_label_count_absolute_case, '\n',edges_label_duration)
 
# remove those which should have no hour()
correct_label <- gsub("\n.*","",edges_label_clean[!grepl("hour", edges_label)])
edges_label_clean[!grepl("hour", edges_label)] <- correct_label
# assign to process object
processMap$edges_df$label <- edges_label_clean

DiagrammeR::export_graph(graph = processMap, file_type = 'png', file_name = 'processMap.png')

下面是 PowerBI 桌面的可视化输出

发布到 PowerBI 门户时,出现以下错误

Error in if (any(ind)) Encoding(x[ind]) <- "bytes" :
missing value where TRUE/FALSE needed
In addition: Warning message:
Prefixing `UQ()` with the rlang namespace is deprecated as of rlang 0.3.0.
Please use the non-prefixed form or `!!` instead.

# Bad:
rlang::expr(mean(rlang::UQ(var) * 100))

# Ok:
rlang::expr(mean(UQ(var) * 100))

# Good:
rlang::expr(mean(!!var * 100))


rlang 在桌面上的是 rlang_0.4.10,而 PowerBI Web 的是 rlang_0.3.0

我最终重写了自定义代码,因此 function 中没有 function,下面的错误代码引用了

# Bad:
rlang::expr(mean(rlang::UQ(var) * 100))

我怀疑相关函数是这个

regmatches(edges_label, gregexpr("\(.*?\)", edges_label))

不能真正明确地说是这种情况,但无论如何,下面更新的代码在发布到 PowerBI 时不会再产生错误 service/web。

library(bupaR)
library(DiagrammeR)
library(tidyverse)
library(lubridate)


# convert to proper date


processMap <- patients %>%
  process_map(sec = performance(median, "hours")
              ,type = frequency("relative_case")
              ,type_edges = frequency("absolute_case")
              ,rankdir = "LR"
              ,layout = layout_pm(edge_weight = TRUE)
              ,fixed_edge_width = F
              ,render = F
  )

# customisation(label, color, font)
processMap$nodes_df$label <- stringr::str_replace_all(processMap$nodes_df$label, c('ARTIFICIAL_START' = 'Start', 'ARTIFICIAL_END' = 'End'))
processMap$nodes_df$color <- stringr::str_replace_all(processMap$nodes_df$color, c('chartreuse4' = '#769e00', 'brown4' = '#7a0f2d'))
processMap$nodes_df$fontcolor <- stringr::str_replace_all(processMap$nodes_df$fontcolor, c('chartreuse4' = '#769e00', 'brown4' = '#7a0f2d'))
processMap$nodes_df$fontname <- stringr::str_replace_all(processMap$nodes_df$fontname, c('Arial' = 'Calibri'))
processMap$edges_df$fontname <- stringr::str_replace_all(processMap$edges_df$fontname, c('Arial' = 'Calibri'))
# change edge with
processMap$edges_df$penwidth <- scales::rescale(processMap$edges_df$penwidth, to = c(0.5, 4)) 

# custom duration edges
edges_label <- processMap$edges_df$label
# extract within bracket
tmp <- stringr::str_extract(string = edges_label,
                     pattern = "(?<=\().*(?=\))")
tmp <- stringr::str_replace_all(tmp, c(' hours'=''))
tmp[is.na(tmp)] <- '0'
tmp <- as.numeric(tmp)*60*60
tmp <- lubridate::as.duration(tmp)

tmp <- stringr::str_extract(string = tmp,
                            pattern = "\(.*?\)")
tmp[is.na(tmp)] <- '(<1 hour)'
edges_label_duration <- tmp
edges_label_count_absolute_case <- gsub("\n.*","",edges_label)
edges_label_clean <- paste0(edges_label_count_absolute_case, '\n',edges_label_duration)
 
# remove those which should have no hour()
correct_label <- gsub("\n.*","",edges_label_clean[!grepl("hour", edges_label)])
edges_label_clean[!grepl("hour", edges_label)] <- correct_label
# assign to process object
processMap$edges_df$label <- edges_label_clean

DiagrammeR::export_graph(graph = processMap, file_type = 'png', file_name = 'processMap.png')