2022年12月31日 星期六

openai artwork with R

使用R進行 openai 藝術創作









https://youtu.be/izha883dq-E

【謝謝各位大大按 訂閱、開啟小鈴鐺


OpenAI [https://openai.com/] 相繼推出 GPT-3 語言模型與 DALL-E2 AI 產生器, 使用者只要輸入文字, 即可以產生的超現實主義圖片, 參考圖1所示, 本篇文章示範 R 與 openai 套件的應用.

圖1 太空人騎馬照


步驟1 建立 OpenAI 帳號

開啟 OpenAI 網頁的API連結 [https://openai.com/api/], 參考圖2. 如果第1次登入, 選取右側 SIGN UP按鈕, 新增帳號. 如果已經有帳號, 直接選取左側 LOG IN 按鈕


圖2 OpenAI API 畫面



登入成功後, 右側 [M Personal] \ View API Keys \ + Create new secret key, 結果會顯示 API Key, 記得按下 [Copy] 按鈕, 後續須複製到 R 程式碼.

圖3 API Key 畫面




右側 [M Personal] \ Manage account, 結果會顯示目前帳戶餘額, 預設前3個月會有 USD.18元可使用. 注意本項服務不是完全免費. Pricing 網頁有提供價格訊息 [https://openai.com/api/pricing/].

圖4 Manage accoun 畫面



步驟2 安裝 openai 套件


步驟3 完整 R 程式碼

# Title    : openai artwork with R
# Author   : Ming-Chang Lee
# Email    : alan9956@gmail.com
# RWEPA    : http://rwepa.blogspot.tw/
# GitHub   : https://github.com/rwepa
# Encoding : UTF-8

# 步驟1 建立 OpenAI 帳號
# https://openai.com/api/

# 步驟2 安裝 openai 套件
# https://cran.r-project.org/web/packages/openai/index.html
install.packages("openai")

# 輸入步驟1所建立的 API key
Sys.setenv(
  OPENAI_API_KEY = '輸入步驟1所建立的 API key'
)

# 載入 openai 套件
library(openai)

# 建立完成物件
create_completion(
  model = "ada",
  prompt = "Generate a question and an answer"
)

# 範例1 太空人騎馬照
create_image("An astronaut riding a horse in a photorealistic style")

# 上述程式碼會建立連結網址, 參考圖5.

圖5 create_image 畫面



# 將 https:// 開始的所有字元複製到瀏覽器, 即可呈現圖1之結果.


# 範例2 山谷兔照
create_image("flying rabbit in the valley")

圖6 山谷飛兔照




# HAPPY NEW YEAR 2023

2022年10月22日 星期六

shiny for Python (Python 使用 shiny 模組教學)

Python 程式使用 shiny 模組執行結果:











R語言的 shiny 套件可以建立跨平台的互動式網頁,今年(2022)RStudio 研討會宣佈 shiny for Python, 表示在 Python 環境亦可執行 shiny 建立互動式網頁。

PyPI shiny: https://pypi.org/project/shiny/


Youtube 說明:








https://youtu.be/s2fgEAa6lq0

【謝謝各位大大幫忙按 訂閱、開啟小鈴鐺


PDF講義大綱:

  1. RWEPA 簡介
  2. 資料分析架構 --> APC方法
  3. 資料分析與視覺化應用
  4. shiny 簡介
  5. shiny for Python 實作篇1 - my_app
  6. shiny for Python 實作篇2 – 01_hello
  7. 結論

https://github.com/rwepa/shiny_python/blob/main/shiny_python_tutorial.pdf


Python 程式:

https://github.com/rwepa/shiny_python/blob/main/pyshiny_01_hello.py


檔案架構:

  • shiny 一般以資料夾方式儲存, 本例為 pyshiny_01_hello 資料夾
  • Python 主程式: pyshiny_01_hello.py, 程式名稱不一定是 app.py
  • Python 主程式路徑: D:\shinydemo\pyshiny_01_hello\pyshiny_01_hello.py


執行方式:

Windows 開啟命令提示字元,輸入以下內容:

  • d:
  • cd shinydemo
  • shiny run --reload pyshiny_01_hello/pyshiny_01_hello.py
  • 瀏覽器輸入 http://localhost:8000/






參考資料:

  1. RWEPA: http://rwepa.blogspot.com/
  2. RWEPA shiny: http://rwepa.blogspot.com/search?q=shiny
  3. Shiny for R: https://shiny.rstudio.com/
  4. Shiny for Python: https://shiny.rstudio.com/py/
  5. shiny for Python 實作篇2 – 01_hello 程式碼: https://github.com/rwepa/shiny_python

# end

2022年8月28日 星期日

Python 連接 Microsoft SQL Server

Python 連接 Microsoft SQL Server (Windows 10)

感謝 Jian-Guo 提供問題.






系統:

Windows 10, Microsoft SQL Server 2019 Developer Edition, Python 3.9.12

目標:

在 Windows 系統中, 希望使用 Python - sqlalchemy 模組, 連結 Micorosft SQL Server.

方法:

步驟1: 下載 Microsoft SQL Server

首先至 Microsoft SQL Server 的網頁下載並安裝 SQL Server [https://www.microsoft.com/en-us/sql-server/sql-server-downloads], 參考下圖下載 SQL Server 2019 Developer.

















參考下圖 SQL Server 安裝執行畫面.















如果想使用 R 連接 Microsoft SQL Server, 請參考 [http://rwepa.blogspot.com/2013/08/rodbc-sql-server.html].

步驟2: 下載並安裝 sqlalchemy 模組

方法1: conda install -c anaconda sqlalchemy
方法2: pip install sqlalchemy

步驟3: 使用 sqlalchemy 模組連結 Microsoft SQL Server

# sqlalchemy_sql.py
import sqlalchemy
print(sqlalchemy.__version__) # 1.4.32

from sqlalchemy import create_engine
import pandas as pd

Server = 'localhost'
Database = 'Northwind'
Driver = 'ODBC Driver 17 for SQL Server'
Database_Con = f'mssql://@{Server}/{Database}?driver={Driver}'

engine = create_engine(Database_Con)
con = engine.connect()
con

df = pd.read_sql_query('SELECT * FROM Employees', con)
df.iloc[0:3,0:4]
###

執行畫面:















# end

2022年7月31日 星期日

Standard Deviation in Python, R





標準差之計算在 Python, R 結果都相同嗎?

感謝 Pei-Chun 提供 Python 問題.

標準差

統計學的標準差(Standard Deviation, SD)可以區分為母體標準差與樣本標準差, 符號之說明如下:

σ: 母體標準差, N: 母體個數, μ:  母體平均值

s: 樣本標準差, n: 樣本個數, x_bar: 樣本平均值

母體標準差與樣本標準差之計算公式:











公式法

考慮資料集為 {1,2,3,4,5}, μ = (1+2+3+4+5)/5=3, 使用公式法計算結果:

母體標準差 σ =(((1-3)^2+...+(5-3)^2)/5)^0.5=1.414214 (分母為5)

樣本標準差 σ =(((1-3)^2+...+(5-3)^2)/4)^0.5=1.581139 (分母為4)

Python-numpy 模組-不含NA值

使用 numpy.std 函數可以計算標準差, 分母預設值為樣本數 n, 其中參數 ddof(Means Delta Degrees of Freedom) 的預設值為 ddof=0, 如果設定 ddof=1, 則分母為 n-1, 詳細參考線上說明 [LINK].







Python-pandas 模組-不含NA值

使用 pandas.describe 函數以計算標準差, 其預設值為 n-1. 

使用 df.describe().iloc[2,0] 取出 std 值, 另外也可以使用 df.describe().loc['std'] 取出 std值.











Python-numpy 模組-有NA值

上述討論都沒有NA值的情形, 如果資料包括NA值時, 其計算結果為 nan, 使用 numpy.nanstd 函數可以忽略 NA值並計算標準差.
















Python-pandas 模組-有NA值

使用 pandas.describe 函數以計算標準差, 其預設值為 n-1, 且會忽略NA值並計算標準差, 此特性須特別注意.


R-不含NA值

使用 sd {stats} 函數可計算標準差. stats 為R內建30個標準套件之一, 啟動R時, 已經載入該套件. 計算結果分母採用 n-1.






R-有NA值

如果資料有NA值, 則 sd 計算結果為 NA. 

使用 na.rm = TRUE 參數可忽略NA值並計算標準差.








結論

使用 Python 與 R 語言須確認計算標準差之意義, 如果資料有NA值, 須特別小心處理.

# end

2022年7月2日 星期六

Python Orange-Associate Tutorial

主題: Python Orange - 關聯規則教學


本篇說明 Python 的 Orange 模組中,  外掛 Associate 的使用, 包括建立頻繁項目集與關聯規則.

感謝 Chen-Yao 提供此問題.




















Youtube: 













Orange 3 特性:
University of Ljubljana, Slovenia, 10 October 1996
視覺化程式設計工具(Visual Programming Tools)
執行更加快速(C++)與視覺化操作
提供多種機器學習模組
開放原始碼與跨平台
適用於Python模組
資料預處理
模型訓練
部署

大綱:
1. Orange 3 簡介
2. Orange 3 安裝 
3. 安裝 Add-ons Associate
4. 案例示範 (技巧: Pivot Table 樞紐分析)
5. Q & A


Github資料:

資料集:
northwind_trans.csv

2022年6月17日 星期五

R-normalizePath Error - OneDrive/??

問題:

近日安裝 Windows 與 R之後會有以下 normalizePath 語法錯誤:




查詢發現電腦確實有以下之目錄 C:\Users\asus\OneDrive\文件, 因此最有可能原因是此路徑包括中文字型"文件", 因此R解析結果為錯誤??

使用 path.expand 函數亦是錯誤

> path.expand("~/")

[1] "C:/Users/asus/OneDrive/??/"


使用 normalizePath 函數也有錯誤

> normalizePath(path.expand("~/"))

[1] "C:\\Users\\asus\\OneDrive\\??\\"

Warning message:

In normalizePath(path.expand(path), winslash, mustWork) :

  path[1]="C:/Users/asus/OneDrive/??/": 檔案名稱、目錄名稱或磁碟區標籤語法錯誤。


方法:

步驟1. 先關閉 RStudio


步驟2. 新增系統變數

1. 程式集 \ 設定 \ 關於 \ 進階系統設定


2. 選取環境變數


3. 按 系統變數 \ 新增














4. 設定名稱與值, 依實際需求修改, 按確定.

變數名稱: HOME

變數值:     C:\Users\asus






步驟3. 重新開啟 RStudio 或重新啟動 Windows 結果為正確

> path.expand("~/")

[1] "C:/Users/asus/"

> normalizePath(path.expand("~/"))

[1] "C:\\Users\\asus"

# end

2022年5月29日 星期日

iPAS - Big Data Analyst - Free Course


iPAS - 巨量資料分析師認證 - 免費線上參考課程

講師:李明昌

考試網址:https://www.ipas.org.tw/bda/


巨量資料分析師-資料導向程式設計(一)

網址:https://collegeplus.itri.org.tw/course/1161

單元一:資料類型與物件

單元二:資料庫概念(含NoSQL)

單元三:資料匯入與匯出


巨量資料分析師-資料導向程式設計(二)

網址:https://collegeplus.itri.org.tw/course/1162

單元一:程式設計類型

單元二:自訂函數與控制敘述

單元三:程式除錯與效能提升方法


巨量資料分析師-資料處理與分析概論(一)

網址:https://collegeplus.itri.org.tw/course/1165

單元一:資料組織與清理(1)

單元二:資料組織與清理(2)

單元三:資料摘要與彙總(1)

單元四:資料摘要與彙總(2)

單元五:屬性轉換與萃取(1)

單元六 : 屬性轉換與萃取(2)

單元七 : 巨量資料處理概念(1)

單元八 : 巨量資料處理概念(2)


巨量資料分析師-資料處理與分析概論(二)

網址:https://collegeplus.itri.org.tw/course/1166

單元一:統計分析基礎(1)

單元二:統計分析基礎(2)

單元三:統計分析基礎(3)

單元四:探索式資料分析與非監督式學習(1)

單元五:探索式資料分析與非監督式學習(2)

單元六:線性模型與監督式學習(1)

單元七 : 線性模型與監督式學習(2)

# end

2022年5月26日 星期四

R-4.2.0 and RStudio-2022.02.2+485 - Updated Notice

R-4.2.0, RStudio-2022.02.2+485 - Windows更新事項

  • RStudio 2022.02.2+485 預設為UTF-8編碼.



  • Windows 環境 R-4.2.0 已經使用 UTF-8 編碼. 早期版本 R原生 Winodws 環境使用 CP950編碼, RStudio 環境一般使用 UTF-8編碼, 二者編碼沒有一致, 目前 Winodws 系統中已經直接支援 UTF-8 編碼.
  • 在Windows 系統中, read.table 匯入文字檔案, 不用更改為 ANSI 編碼, 直接使用 UTF-8 即可匯入.
  • 早期 R 版本(例: R-4.1.3) 預設自行安裝R套件的目錄為【我的文件】, 例:  "C:/Users/User/Documents/R/win-library/4.1" 使用 .libPaths() 結果如下圖:




  • 目前 R 最新版本(例: R-4.2.0) 預設自行安裝R套件的目錄為【AppData】, 例:  "C:\Users\User\AppData\Local\R\win-library\4.2" 使用 .libPaths() 結果如下圖:






  • AppData 資料夾預設為隱藏檔,使用檔案總管將隱藏檔開啟. 如果不希望更改隱藏檔的設定, 使用 shell.exec(.libPaths()[1]) 函數亦可開啟檔案總管視窗.
  • help 函數結果已經支援HTML5語法.
  • 支援 two-sample Smirnov statistic 檢定函數: psmirnov, qsmirnov, rsmirnov, 參考線上說明.
# end


2022年5月5日 星期四

Regression Analysis in Excel (Excel 迴歸分析)

Excel 迴歸分析:

步驟1: Excel \ 檔案 \ 選項 \ 分析工具箱 \ 執行 \ 確定

步驟2: 資料\ 資料分析 \ 迴歸 \ 確定



資料集下載: https://github.com/rwepa/DataDemo/blob/master/marketing.csv

# end

2022年4月3日 星期日

原生管線操作 (native pipe operator)

主題

R-4.1版本以上開始支援原生管線操作(native pipe operator),管線操作可簡化R程式的撰寫。一般可以使用 magrittr 套件%>% 運算式進行管線操作,目前 R-4.1 以上版本可以使用 |> 進行管線操作。

R程式碼

# (1)傳統指派依序建立物件

x <- iris$Petal.Width[iris$Species== "virginica"]

x_density <- density(x)

plot(x_density, main = "Density plot")

grid()


# (2)使用 magrittr 套件

library(magrittr)

iris$Petal.Width[iris$Species== "virginica"] %>%

  density() %>%

  plot(main = "Density plot using '%>%'") %>%

  grid()


# (3)使用原生管線操作 |>

iris$Petal.Width[iris$Species== "virginica"] |>

  density() |>

  plot(main = "Density plot using native pipe operator '|>'")>

  grid()

# end

2022年2月4日 星期五

R資料框操作20技巧 (20 Tips for data.frame)

主題:

R語言中資料框的處理是重要技術之一,本篇文章說明資料框的常用處理技巧。



關鍵字:

  • 列(Row),行(Column)篩選
  • 類別 class
  • 維度 dim
  • 列名稱 row.names
  • 行可稱 colnames, names
  • 結構 str
  • 摘要 summary
  • 屬性 attributes
  • apply
  • lapply
資料框操作20技巧:

> # 技巧1 篩選行,結果為 vector

> iris$Sepal.Length

  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

 [11] 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 

...

> # 技巧2 篩選行,結果為 vector(二個單引號)

> iris[, 'Sepal.Length']

  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

 [11] 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1

...

> # 技巧3 篩選行,結果為 vector(二個雙單引號)

> iris[, "Sepal.Length"]

  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

 [11] 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1

...

> # 技巧4 篩選行,結果為 vector

> iris[, 1]

  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

 [11] 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1

...

> # 技巧5 篩選行,結果為 vector

> iris[['Sepal.Length']]

  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

 [11] 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1

...

> # 技巧6 篩選行,結果為 vector

> iris[["Sepal.Length"]]

  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

 [11] 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1

...

> # 技巧7 篩選行,結果為 data.frame

> iris['Sepal.Length']

    Sepal.Length

1            5.1

2            4.9

3            4.7

...

> # 技巧8 篩選行,結果為 data.frame

> iris["Sepal.Length"]

    Sepal.Length

1            5.1

2            4.9

3            4.7

...

> # 技巧9 篩選列,結果為 data.frame

> iris[1, ]

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1          5.1         3.5          1.4         0.2  setosa

> # 技巧10 篩選列,使用數值轉換,再加數值1,省略as.numeric會有錯誤

> as.numeric(iris[1,-5]) + 1

[1] 6.1 4.5 2.4 1.2

> # 技巧11 類別

> class(iris)

[1] "data.frame"

> # 技巧12 維度,結果為150列,5行

> dim(iris)

[1] 150   5

> # 技巧13 列名稱

> row.names(iris)

  [1] "1"   "2"   "3"   "4"   "5"   "6"   "7"   "8"   "9"   "10" 

...

> # 技巧14 行名稱

> colnames(iris)

[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

> # 技巧15 行名稱

> names(iris)

[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

> # 技巧16 資料結構

> str(iris)

'data.frame': 150 obs. of  5 variables:

 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...

 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...

 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...

 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 ...

> # 技巧17 資料摘要

> summary(iris)

  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  

 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  

 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  

 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  

 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  

 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  

 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500                  

> # 技巧18 資料屬性

> attributes(iris)

$names

[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     

$class

[1] "data.frame"

$row.names

  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20

 [21]  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40

> # 技巧19 各列或各行群組計算

> apply(iris[-5], 1, mean)

  [1] 2.550 2.375 2.350 2.350 2.550 2.850 2.425 2.525 2.225

 [10] 2.400 2.700 2.500 2.325 2.125 2.800 3.000 2.750 2.575

...

> # 技巧20 各行群組計算,回傳結果為串列(list)- lapply 以行運算為主

> lapply(iris[-5], mean)

$Sepal.Length

[1] 5.843333

$Sepal.Width

[1] 3.057333

$Petal.Length

[1] 3.758

$Petal.Width

[1] 1.199333

# end

2022年1月29日 星期六

R自訂套件安裝目錄 (customized package directory)

主題

R 在安裝目錄時, 如果有客製化需求, 可以設定套件安裝目錄, 本篇說明R的安裝目錄, 套件訊息與客製化安裝套件目錄之方法. 本方法使用R函數設定, 可用於 Windows, macOS, ubuntu等作業系統, 以下執行結果可能因使用者名稱與安裝路徑不同而有所差異.

感謝 Ying-Zhe 提供此問題.

關鍵字

# R.home()

# find.package('套件名稱')

# packageVersion('套件名稱')

# .libPaths()

# Rprofile.site

1. 查詢R的安裝目錄

R.home()

# Windows 10

# "C:/PROGRA~1/R/R-41~1.2"


# macOS Catalina

[1] "/Library/Frameworks/R.framework/Resources"


# ununtu 20.04.3

[1] "/usr/lib/R"


2. 套件安裝目錄

find.package('ggplot2')

# Windows 10

[1] "C:/Users/user/Documents/R/win-library/4.1/ggplot2"


# macOS Catalina

[1] "/Library/Frameworks/R.framework/Versions/4.1/Resources/library/ggplot2"


# ununtu 20.04.3

[1] "/home/rwepa/R/x86_64-pc-linux-gnu-library/4.1/ggplot2"

3. 套件版本

packageVersion('ggplot2')

[1] ‘3.3.5’

4. 套件訊息

packageDescription('ggplot2')

Package: ggplot2

Version: 3.3.5

Title: Create Elegant Data Visualisations Using the Grammar of Graphics

....

5. 自訂套件安裝目錄

方法1-每次啟動R或RStudio皆須設定

# 步驟1 顯示套件下載與安裝目錄

.libPaths()

# [1] "C:/Users/user/Documents/R/win-library/4.1"

# [2] "C:/Program Files/R/R-4.1.2/library"

# 步驟2 建立自訂套件安裝目錄

# 考慮在使用者目錄中,以檔案總管建立 mypackages 目錄,本步驟依實際需求修改.

# 自訂套件目錄之完整路徑 C:/Users/user/mypackages

# 步驟3 加入自訂套件目錄於系統套件搜尋路徑之中

.libPaths('C:/Users/user/mypackages')

# 步驟4 顯示目前套件下載與安裝目錄

.libPaths()

# 結果顯示已經加入完成

# [1] "C:/Users/user/mypackages"          

# [2] "C:/Program Files/R/R-4.1.2/library"

# 步驟5 安裝套件

install.packages("e1071")

# 步驟6 測試套件之載入, 結果顯示正常載入套件,準備收工...

library(e1071)

# 結果正常載入,無錯誤訊息

# 步驟7 重新啟動 R或RStudio 測試套件之載入,發生錯誤!!!

library(e1071)

# Error in library(e1071) : there is no package called ‘e1071’

# 步驟8 重新加入系統套件搜尋路徑之中(因為每次啟動皆須設定)

.libPaths('C:/Users/user/mypackages')

.libPaths()

[1] "C:/Users/user/mypackages"          

[2] "C:/Program Files/R/R-4.1.2/library"

# 步驟9 測試套件之載入,結果顯示正常載入套件,正式完成,還有方法2 ...

library(e1071)

# 結果正常載入,無錯誤訊息

方法2-設定於R組態檔,每次啟動R/RStudio時無需設定

考慮 Windows 10 作業系統, R組態檔 Rprofile.site之位置如下

# C:\Program Files\R\R-4.1.2\etc\Rprofile.site

# 考量已經於以下目錄(C:\Users\user\Documents\R\win-library\4.1)安裝套件

# 使用 Notepad++ 等文字編輯器軟體,於檔案最底下加入以下1行程式,儲存檔案.

.libPaths(c('C:/Users/user/mypackages', 'C:/Users/user/Documents/R/win-library/4.1'))

# 下圖為 Notepad++ 免費軟體編輯 Rprofile.site 畫面


# 重新啟動R或RStudio,套件安裝會自動安裝於 C:/Users/user/mypackages 目錄.

# end