主頁 > 軟體工程 > 如何替換已棄用的ggplot2函式aes_string:接受任意數量的命名字串來指定美學映射?

如何替換已棄用的ggplot2函式aes_string:接受任意數量的命名字串來指定美學映射?

2022-11-14 23:39:00 軟體工程

aes_string在使用 ggplot2 編程時,我使用了一些方便的行為。aes_string已被棄用(我相信自 ggplot2 版本 3.4.0 以來明顯)。我正在努力解決如何很好地替換它。

具體來說,我之前創建了通過省略號接受任意字串引數的函式,并通過 do.call 將它們傳遞給 aes_string,如下面的第一個 reprex 所示。

自從注意到我試圖避免的棄用警告aes_string后,發現自己實際上只是以一種相當“hacky”的方式模仿它。據推測,aes_string導致它被棄用的任何缺陷,也適用于我的 hacky 解決方法。見第二個代表。

有沒有更優雅的解決方案?我想繼續將變數名作為字串傳遞。

用 aes_string 代表我的舊方法

library(ggplot2)

plotterOld <- function(...) {
  args <- list(...)
  pointAes <- do.call(aes_string, args = args)
  ggplot(mpg, aes(displ, cty))  
    geom_point(mapping = pointAes)
}

plotterOld(colour = "cyl", size = "year")
#> Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
#> ? Please use tidy evaluation ideoms with `aes()`

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

# it can accept NULLs, and e.g. intuitively doesn't map size to anything
plotterOld(colour = "cyl", size = NULL)

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

# no arguments also works fine
plotterOld()

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

使用 reprex v2.0.2 創建于 2022-11-11


代表我替換 aes_string 行為的駭人聽聞的嘗試?

library(ggplot2)

# arbitrary aesthetics passed as strings using ellipses, aes, quo and .data
myAesString <- function(...) {
  dots <- list(...)
  # early exits
  stopifnot(rlang::is_named2(dots))
  if (length(dots) == 0) {
    return(NULL)
  }
  
  # initialise empty mapping object and fill it with quosures where appropriate
  mapping <- aes()
  for (n in names(dots)) {
    v <- dots[[n]]
    if (!is.null(v)) {
      if (!rlang::is_string(v)) stop(n, " must be a string or NULL")
      mapping[[n]] <- quo(.data[[v]])
    }
  }
  return(mapping)
}

plotterNew <- function(...) {
  pointAes <- myAesString(...)
  ggplot(mpg, aes(displ, cty))  
    geom_point(mapping = pointAes)
}

plotterNew(colour = "cyl", size = "year")

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

plotterNew(colour = "cyl", size = NULL, shape = "drv")

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

plotterNew()

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?


# seems to work fine
p <- plotterNew(colour = "cyl", size = "year")
p$layers[[1]]$mapping
#> Aesthetic mapping: 
#> * `colour` -> `.data[["cyl"]]`
#> * `size`   -> `.data[["year"]]`

使用reprex v2.0.2創建于 2022-11-11

會話資訊
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.2.1 (2022-06-23)
#>  os       macOS Big Sur ... 10.16
#>  system   x86_64, darwin17.0
#>  ui       X11
#>  language (EN)
#>  collate  en_GB.UTF-8
#>  ctype    en_GB.UTF-8
#>  tz       Europe/Amsterdam
#>  date     2022-11-11
#>  pandoc   2.18 @ /Applications/RStudio.app/Contents/MacOS/quarto/bin/tools/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date (UTC) lib source
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.2.0)
#>  cli           3.4.1   2022-09-23 [1] CRAN (R 4.2.0)
#>  colorspace    2.0-3   2022-02-21 [1] CRAN (R 4.2.0)
#>  curl          4.3.3   2022-10-06 [1] CRAN (R 4.2.0)
#>  DBI           1.1.3   2022-06-18 [1] CRAN (R 4.2.0)
#>  digest        0.6.30  2022-10-18 [1] CRAN (R 4.2.1)
#>  dplyr         1.0.10  2022-09-01 [1] CRAN (R 4.2.0)
#>  evaluate      0.18    2022-11-07 [1] CRAN (R 4.2.0)
#>  fansi         1.0.3   2022-03-24 [1] CRAN (R 4.2.0)
#>  farver        2.1.1   2022-07-06 [1] CRAN (R 4.2.0)
#>  fastmap       1.1.0   2021-01-25 [1] RSPM (R 4.2.0)
#>  fs            1.5.2   2021-12-08 [1] RSPM (R 4.2.0)
#>  generics      0.1.3   2022-07-05 [1] CRAN (R 4.2.0)
#>  ggplot2     * 3.4.0   2022-11-04 [1] CRAN (R 4.2.1)
#>  glue          1.6.2   2022-02-24 [1] CRAN (R 4.2.0)
#>  gtable        0.3.1   2022-09-01 [1] CRAN (R 4.2.0)
#>  highr         0.9     2021-04-16 [1] RSPM (R 4.2.0)
#>  htmltools     0.5.3   2022-07-18 [1] CRAN (R 4.2.0)
#>  httr          1.4.4   2022-08-17 [1] CRAN (R 4.2.0)
#>  knitr         1.40    2022-08-24 [1] CRAN (R 4.2.0)
#>  labeling      0.4.2   2020-10-20 [1] CRAN (R 4.2.0)
#>  lifecycle     1.0.3   2022-10-07 [1] CRAN (R 4.2.0)
#>  magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.2.0)
#>  mime          0.12    2021-09-28 [1] RSPM (R 4.2.0)
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.2.0)
#>  pillar        1.8.1   2022-08-19 [1] CRAN (R 4.2.0)
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.2.0)
#>  purrr         0.3.5   2022-10-06 [1] CRAN (R 4.2.0)
#>  R.cache       0.16.0  2022-07-21 [1] CRAN (R 4.2.0)
#>  R.methodsS3   1.8.2   2022-06-13 [1] CRAN (R 4.2.0)
#>  R.oo          1.25.0  2022-06-12 [1] CRAN (R 4.2.0)
#>  R.utils       2.12.1  2022-10-30 [1] CRAN (R 4.2.0)
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.2.0)
#>  reprex        2.0.2   2022-08-17 [1] CRAN (R 4.2.0)
#>  rlang         1.0.6   2022-09-24 [1] CRAN (R 4.2.0)
#>  rmarkdown     2.18    2022-11-09 [1] CRAN (R 4.2.1)
#>  rstudioapi    0.14    2022-08-22 [1] CRAN (R 4.2.0)
#>  scales        1.2.1   2022-08-20 [1] CRAN (R 4.2.0)
#>  sessioninfo   1.2.2   2021-12-06 [1] RSPM (R 4.2.0)
#>  stringi       1.7.8   2022-07-11 [1] CRAN (R 4.2.0)
#>  stringr       1.4.1   2022-08-20 [1] CRAN (R 4.2.0)
#>  styler        1.8.1   2022-11-07 [1] CRAN (R 4.2.0)
#>  tibble        3.1.8   2022-07-22 [1] CRAN (R 4.2.0)
#>  tidyselect    1.2.0   2022-10-10 [1] CRAN (R 4.2.0)
#>  utf8          1.2.2   2021-07-24 [1] CRAN (R 4.2.0)
#>  vctrs         0.5.0   2022-10-22 [1] CRAN (R 4.2.0)
#>  withr         2.5.0   2022-03-03 [1] CRAN (R 4.2.0)
#>  xfun          0.34    2022-10-18 [1] CRAN (R 4.2.0)
#>  xml2          1.3.3   2021-11-30 [1] RSPM (R 4.2.0)
#>  yaml          2.3.6   2022-10-18 [1] CRAN (R 4.2.1)
#> 
#>  [1] /Library/Frameworks/R.framework/Versions/4.2/Resources/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────
```

uj5u.com熱心網友回復:

一種選擇是使用以下方法將帶引號的字串串列轉換為符號sym

library(ggplot2)

plotterOld <- function(...) {
  args <- lapply(list(...), function(x) if (!is.null(x)) sym(x))
  
  pointAes <- do.call(aes, args = args)
  ggplot(mpg, aes(displ, cty))  
    geom_point(mapping = pointAes)
}

更新!!!我們可以通過使用來進一步簡化do.call

plotterOld <- function(...) {
  args <- lapply(list(...), function(x) if (!is.null(x)) sym(x))
  
  ggplot(mpg, aes(displ, cty))  
    geom_point(mapping = aes(!!!args))
}
plotterOld(colour = "cyl", size = "year")

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?


plotterOld(colour = "cyl", size = NULL)

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?


plotterOld()

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

uj5u.com熱心網友回復:

您可以使用ensyms將命名字串引數轉換為命名符號引數,因此與舊繪圖函式等效的可能是

library(ggplot2)

plotterNew <- function(...) {
  ggplot(mpg, aes(displ, cty))  
    geom_point(mapping = aes(!!!ensyms(...)))
}

plotterNew(colour = "cyl", size = "year")

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

使用reprex v2.0.2創建于 2022-11-12

uj5u.com熱心網友回復:

Stefan 建議sym()和 Allan Cameron 建議的答案ensyms()都確實幫助我指出了理解這個問題的正確方向,所以所有的功勞都歸功于他們。

這個答案比較了這兩種方法并添加了第三種方法data_sym()

aes_string 的兩種行為,如下所示,我能夠使用 sym() 進行復制,但不能使用 ensyms()

  1. aes_string 可以接受 NULL 作為引數的值,
  2. aes_string 可以使用已經存盤在物件中的字串
library(rlang)
library(ggplot2)

plotterAesString <- function(...) {
  pointAes <- do.call(aes_string, args = list(...))
  ggplot(mpg, aes(displ, cty))  
    geom_point(mapping = pointAes)
}

colourObject <- "cyl" 
plotterAesString(colour = colourObject, size = NULL, shape = "drv") 
#> Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
#> ? Please use tidy evaluation ideoms with `aes()`

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

Stefan 對 sym() 的建議使我采用了這種方法,這似乎是使用 aes_string 的一個很好的替代品


plotterSym <- function(...) {
  args <- list(...)
  args <- lapply(args, function(x) if (is_string(x)) sym(x) else x)
  ggplot(mpg, aes(displ, cty))   geom_point(mapping = aes(!!!args))
}

plotterSym(colour = colourObject, size = NULL, shape = "drv") 

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

我發布這個答案是因為 rlang 的 data_sym() 函式可以防止意外匹配環境變數而不是資料變數的問題。(原來的 aes_string 方法也有這種行為!)


driv <- "misspelled variable?"
plotterSym(shape = "driv") 

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?


plotterDataSym <- function(...) {
  args <- list(...)
  args <- lapply(args, function(x) if (is_string(x)) data_sym(x) else x)
  ggplot(mpg, aes(displ, cty))   geom_point(mapping = aes(!!!args))
}

它就像 sym 方法一樣作業

plotterDataSym(colour = colourObject, size = NULL, shape = "drv") 

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?

但是拼寫錯誤的名稱會出錯,這對我來說是可取的行為。


plotterDataSym(shape = "driv") 
#> Error in `geom_point()`:
#> ! Problem while computing aesthetics.
#> ? Error occurred in the 1st layer.
#> Caused by error in `.data$driv`:
#> ! Column `driv` not found in `.data`.

#> Backtrace:
#>      ▆
#>   1. ├─base::tryCatch(...)
#>   2. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#>   3. │   ├─base (local) tryCatchOne(...)
#>   4. │   │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#>   5. │   └─base (local) tryCatchList(expr, names[-nh], parentenv, handlers[-nh])
#>   6. │     └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#>   7. │       └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#>   8. ├─base::withCallingHandlers(...)
#>   9. ├─base::saveRDS(...)
#>  10. ├─base::do.call(...)
#>  11. ├─base (local) `<fn>`(...)
#>  12. ├─global `<fn>`(input = base::quote("pious-rhino_reprex.R"))
#>  13. │ └─rmarkdown::render(input, quiet = TRUE, envir = globalenv(), encoding = "UTF-8")
#>  14. │   └─knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet)
#>  15. │     └─knitr:::process_file(text, output)
#>  16. │       ├─base::withCallingHandlers(...)
#>  17. │       ├─knitr:::process_group(group)
#>  18. │       └─knitr:::process_group.block(group)
#>  19. │         └─knitr:::call_block(x)
#>  20. │           └─knitr:::block_exec(params)
#>  21. │             └─knitr:::eng_r(options)
#>  22. │               ├─knitr:::in_input_dir(...)
#>  23. │               │ └─knitr:::in_dir(input_dir(), expr)
#>  24. │               └─knitr (local) evaluate(...)
#>  25. │                 └─evaluate::evaluate(...)
#>  26. │                   └─evaluate:::evaluate_call(...)
#>  27. │                     ├─evaluate (local) handle(...)
#>  28. │                     │ └─base::try(f, silent = TRUE)
#>  29. │                     │   └─base::tryCatch(...)
#>  30. │                     │     └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#>  31. │                     │       └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#>  32. │                     │         └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#>  33. │                     ├─base::withCallingHandlers(...)
#>  34. │                     ├─base::withVisible(value_fun(ev$value, ev$visible))
#>  35. │                     └─knitr (local) value_fun(ev$value, ev$visible)
#>  36. │                       └─knitr (local) fun(x, options = options)
#>  37. │                         ├─base::withVisible(knit_print(x, ...))
#>  38. │                         ├─knitr::knit_print(x, ...)
#>  39. │                         └─knitr:::knit_print.default(x, ...)
#>  40. │                           └─evaluate (local) normal_print(x)
#>  41. │                             ├─base::print(x)
#>  42. │                             └─ggplot2:::print.ggplot(x)
#>  43. │                               ├─ggplot2::ggplot_build(x)
#>  44. │                               └─ggplot2:::ggplot_build.ggplot(x)
#>  45. │                                 └─ggplot2:::by_layer(...)
#>  46. │                                   ├─rlang::try_fetch(...)
#>  47. │                                   │ ├─base::tryCatch(...)
#>  48. │                                   │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#>  49. │                                   │ │   └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#>  50. │                                   │ │     └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#>  51. │                                   │ └─base::withCallingHandlers(...)
#>  52. │                                   └─ggplot2 (local) f(l = layers[[i]], d = data[[i]])
#>  53. │                                     └─l$compute_aesthetics(d, plot)
#>  54. │                                       └─ggplot2 (local) compute_aesthetics(..., self = self)
#>  55. │                                         └─ggplot2:::scales_add_defaults(...)
#>  56. │                                           └─base::lapply(aesthetics[new_aesthetics], eval_tidy, data = data)
#>  57. │                                             └─rlang (local) FUN(X[[i]], ...)
#>  58. ├─driv
#>  59. ├─rlang:::`$.rlang_data_pronoun`(.data, driv)
#>  60. │ └─rlang:::data_pronoun_get(...)
#>  61. └─rlang:::abort_data_pronoun(x, call = y)
#>  62.   └─rlang::abort(msg, "rlang_error_data_pronoun_not_found", call = call)


關于我對 Allan Cameron 建議的 ensyms 方法的測驗的注釋我發現這種方法不能接受包含字串或 NULL 引數的物件,我找不到解決這些問題的方法 ensyms


plotterEnsyms <- function(...) {
  ggplot(mpg, aes(displ, cty))   geom_point(mapping = aes(!!!ensyms(...)))
}

# 1. uses name of object as symbol, instead of converting the string itself

plotterEnsyms(colour = colourObject)

如何替換已棄用的 ggplot2 函式 aes_string:接受任意數量的命名字串來指定美學映射?


# 2. can't accept NULLs, (and ensyms directly uses the args, so NULLs can't be removed first, I think...)
plotterEnsyms(size = NULL)
#> Error in `sym()`:
#> ! Can't convert NULL to a symbol.

#> Backtrace:
#>      ▆
#>   1. └─global plotterEnsyms(size = NULL)
#>   2.   ├─ggplot2::geom_point(mapping = aes(!!!ensyms(...)))
#>   3.   │ └─ggplot2::layer(...)
#>   4.   ├─ggplot2::aes(!!!ensyms(...))
#>   5.   │ └─ggplot2:::arg_enquos("x")
#>   6.   │   └─rlang::eval_bare(expr[[2]][[2]][[2]], env)
#>   7.   └─rlang::ensyms(...)
#>   8.     └─rlang:::map(...)
#>   9.       └─base::lapply(.x, .f, ...)
#>  10.         └─rlang (local) FUN(X[[i]], ...)
#>  11.           └─rlang::sym(expr)
#>  12.             └─rlang:::abort_coercion(x, "a symbol")
#>  13.               └─rlang::abort(msg, call = call)

使用reprex v2.0.2創建于 2022-11-13

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/533299.html

標籤:rggplot2rlang神经网络非标准评价

上一篇:如何在填充ggplot2中按變數排序條形圖

下一篇:使用R構建帶有資料標簽的疊加條形圖

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more