很久没有使用 R 语言了,突然发现 RStudio 公司 改名 了,主页为 posit.co 。
RStudio Server 官方下载说明:https://posit.co/download/rstudio-server/
步骤 1:安装 R 语言和 Rserver
注意:安装 R 语言的命令不建议直接使用我这里写的,因为 CRAN 源被设置成
cloud.r-project.org
。建议直接参考 清华镜像源的安装和设置。
- 安装 R 语言:http://cran.rstudio.com/bin/linux/ubuntu/ 。注意第一次添加源时要验证秘钥
1
2
3
4
5
6
7
8
9
10
# update indices
sudo apt update -qq
# install two helper packages we need
sudo apt install --no-install-recommends software-properties-common dirmngr
# add the signing key (by Michael Rutter) for these repos
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
gpg --show-keys /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
# add the R 4.0 repo from CRAN -- adjust 'focal' to 'groovy' or 'bionic' as needed
sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
- 安装 RStudio Server:参考官网命令,因为你肯定下载最新的
1
2
3
sudo apt-get install gdebi-core
wget https://download2.rstudio.org/server/bionic/amd64/rstudio-server-2023.03.0-386-amd64.deb
sudo gdebi rstudio-server-2023.03.0-386-amd64.deb
你可以看到成功部署的信息,或者使用 systemctl status rstudio-server.service
查看服务情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Created symlink /etc/systemd/system/multi-user.target.wants/rstudio-server.service → /lib/systemd/system/rstudio-server.service.
TTY detected. Printing informational message about logging configuration. Logging configuration loaded from '/etc/rstudio/logging.conf'. Logging to '/var/log/rstudio/rstudio-server/rserver.log'.
● rstudio-server.service - RStudio Server
Loaded: loaded (/lib/systemd/system/rstudio-server.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2023-03-26 15:18:48 CST; 1s ago
Process: 2573741 ExecStart=/usr/lib/rstudio-server/bin/rserver (code=exited, status=0/SUCCESS)
Main PID: 2573754 (rserver)
Tasks: 4 (limit: 2310)
Memory: 19.4M
CGroup: /system.slice/rstudio-server.service
└─2573754 /usr/lib/rstudio-server/bin/rserver
Mar 26 15:18:48 zjp systemd[1]: Starting RStudio Server...
Mar 26 15:18:48 zjp systemd[1]: Started RStudio Server.
端口部署在 8787,可通过 netstat -tplugn
查看进程为 rserver 的端口。
步骤 2:登录 Rserver
根据官方说明,用户验证需要注意以下事项:
- 不允许 user id 低于 100 的 system users 登录
- 访问网络时,用户信息使用 RSA 加密
- 使用 Linux 用户管理工具
useradd
和userdel
管理帐号 - 每个用户有自己的 home directory
1
2
3
4
# 创建账户
useradd rserver -u 8787
# 设置密码
passwd zjp
然后用新的账户和密码登录。
步骤 3:修改 CRAN 源
如果你在安装时已经使用清华镜像的 步骤,那么大概率无需设置源。
或者如果你想更改其他的源,可以这么做:
在账户目录下(我的是 /home/rserver/
),创建 .Rprofile
文件,里面写
1
options("repos" = c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
这也适用于解决 cran repositories modified outside package preferences
问题。
重开 REPL,通过 R 语言的 getOption("repos")
命令,你可以看到当前的镜像。
Shiny
运行示例
1
2
3
4
5
6
7
library("shiny")
# 查看、运行示例
runExample(NA)
# Valid examples are "01_hello", "02_text", "03_reactivity", "04_mpg", "05_sliders",
# "06_tabsets", "07_widgets", "08_html", "09_upload", "10_download", "11_timer"
runExample("01_hello")
这 11 个示例的代码非常容易看懂。
ChatGPT 问答
R 语言显示源代码
要在 R 语言中显示源代码,可以使用以下方法:
- View()函数:View() 函数可以在新的窗口中显示变量、数据集或函数的源代码。例如,要查看 data 这个数据集的源代码,可以输入 View(data)。
- head()函数:head() 函数可以显示数据集的前几行,默认显示前6行。例如,要查看 data 数据集的前10行,可以输入 head(data, 10)。
- print()函数:print() 函数可以打印对象的完整信息和源代码。例如,要查看函数 foo 的源代码,可以输入 print(foo)。
- edit()函数:edit() 函数可以在编辑器中打开一个对象的源代码,使您可以更方便地编辑代码。例如,要编辑函数 foo 的源代码,可以输入 edit(foo)。
- 使用代码编辑器:R Studio 和其他一些集成开发环境(IDE)提供了代码编辑器,您可以在其中创建和编辑 R 语言的脚本文件。这些编辑器还提供了代码高亮、代码提示、自动格式化等功能,使您更轻松地编写代码。
以上是在 R 语言中显示源代码的几种常用方法。请注意,您需要在 R 语言的控制台或脚本文件中输入这些命令来使用它们。
R 语言如何写一个 library
在 R 语言中,可以通过编写自定义 package(包)的方式来创建自己的 library。以下是创建一个 library 的基本步骤:
- 在 R 语言的控制台或 R Studio 的 Console 窗口中,输入以下命令,创建一个 package:
1
2
library(devtools)
create_package("mylibrary")
这将创建一个名为 mylibrary 的新 package 文件夹,其中包含一些默认文件和目录。
- 进入 package 文件夹,编辑 DESCRIPTION 文件。这是一个包含 package 元数据的文本文件,您需要提供包的名称、版本、作者、描述等信息。例如:
1
2
3
4
Package: mylibrary
Version: 0.1
Authors@R: person("Your Name", email = "yourname@email.com", role = c("aut"))
Description: A brief description of what the package does.
- 向 package 中添加自定义函数。在 R 语言中,可以使用 roxygen2 格式编写函数文档和元数据。在 R Studio 中,您可以使用 “New Document” 元素来创建新的函数文件,并使用 roxygen2 标记编写函数文档。例如,以下是一个简单的函数示例:
Copy code
1
2
3
4
5
6
7
8
9
10
11
12
13
#' Add two numbers together
#'
#' This function adds together two numbers and returns the result.
#'
#' @param x A number to be added.
#' @param y A number to be added.
#'
#' @return The sum of x and y.
#'
#' @export
add_numbers <- function(x, y) {
return(x + y)
}
- 构建 package 文件,以便将您的函数打包到可供其他人使用的二进制文件中。使用以下命令进行构建:
1
2
library(devtools)
build("mylibrary")
这将在 package 文件夹中创建一个 tar.gz 文件,其中包含您的 package。
- 将 package 文件安装到您的 R 语言环境中,以便测试和使用。使用以下命令进行安装:
1
install.packages("path/to/mylibrary_0.1.tar.gz", repos = NULL)
或者,如果你使用 devtools 包来构建 package,可以使用以下命令进行安装:
1
2
library(devtools)
install("mylibrary")
完成这些步骤之后,您的 package 应该已经成功创建并安装在您的 R 语言环境中了。其他人可以使用 library(“mylibrary”) 命令来加载并使用您的自定义函数。
R 语言 install.packages 如何设置代理
在使用 install.packages()
命令安装 R 语言包时,如果您的网络环境需要使用代理服务器,可以通过以下方式来设置代理:
- 直接在
install.packages()
命令中设置代理:
1
install.packages("package_name", repos = "http://cran.r-project.org", method = "libcurl", configure.args = "--proxy http://proxy-server:port")
在这里,--proxy
参数指定代理服务器的地址和端口号。请将 http://proxy-server:port
替换为您的代理服务器地址和端口号。
- 设置全局代理:
您还可以在环境变量中设置 R 语言的全局代理,这样您就无需在每个 install.packages()
命令中指定代理。要设置全局代理,请执行以下步骤:
(1)在 R 语言的控制台中输入以下命令,查看当前使用的 libcurl 版本:
1
2
library(methods)
getOption("libcurl.version")
(2)打开 R_HOME/etc/Renviron 文件,其中 R_HOME 是您 R 语言安装的路径,找到以下行:
1
#http_proxy=http://user:password@proxy.net:8080/
如果此行被注释掉了,请取消注释(即去掉 ‘#’ 符号),并将代理地址和端口号改为您的代理服务器地址和端口号。如果您的代理服务器需要用户名和密码认证,请在地址中包含用户名和密码,例如:
1
http_proxy=http://username:password@proxy-server:port
(3)重启 R 语言,现在 install.packages()
命令将自动使用全局代理。如果您需要更改代理设置,请编辑 Renviron 文件并重新启动 R 语言。
这些是设置 R 语言包安装代理的基本方法。根据您的操作系统和网络环境的不同,可能会有一些差异,请根据实际情况选择最适合您的方法。
R 语言设置环境变量
在 R 语言中,可以使用以下命令来设置环境变量:
- 临时设置环境变量:在 R 的控制台中运行以下代码,可以设置临时的环境变量:
1
Sys.setenv(name = value)
在这里,name
表示环境变量的名称,value
表示变量的值。例如,要将名为 “MY_VAR” 的环境变量设置为 “hello world”,可以运行以下命令:
1
Sys.setenv(MY_VAR = "hello world")
设置好后,您可以使用 Sys.getenv()
函数来获取该环境变量的值:
1
Sys.getenv("MY_VAR")
这将返回 “hello world”。
请注意,此方法所设置的环境变量将仅在当前会话中有效,一旦会话结束会被删除。
- 设置全局环境变量:如果你希望 R 语言中的某个环境变量在多个会话和进程之间保持一致,则需要将它设置为全局环境变量。可以通过编辑 R 的环境配置文件
.Renviron
或.Rprofile
来设置全局环境变量。
在 Linux 或 macOS 上,.Renviron
文件通常位于当前用户的主目录中。在 Windows 上,.Renviron
文件通常位于用户文档文件夹中的子文件夹 .R
中。需要创建该 文件(如果不存在)并使用以下格式添加环境变量:
1
MY_VAR="hello world"
保存文件后,关闭所有的 R 会话并重新打开它们,全局环境变量将被自动加载。
另外,.Rprofile
文件中包含有关 R 语言首次启动时要执行的自定义代码。您可以将类似的 Sys.setenv()
命令添加到此文件中,以设置全局环境变量。
除了上述方法,也可以使用其他系统级别的方法来设置环境变量,例如在 Linux 上使用 export
命令,在 Windows 上使用系统属性等。
odbcinst.ini 和 odbc.ini 文件的区别
odbcinst.ini 和 odbc.ini 都是用于ODBC(Open Database Connectivity)的配置文件,但在用途和功能方面存在一些区别。
odbcinst.ini 是一个ODBC安装文件,它保存了ODBC驱动程序和数据源配置。这个文件包含ODBC驱动程序和ODBC驱动程序管理器的安装和配置信息。可以包括以下内容:
- ODBC驱动程序的名称和版本
- 驱动程序的路径
- 驱动程序所支持的数据库的名称和版本
- 驱动程序所支持的ODBC函数的名称和版本
odbc.ini是一个应用程序配置文件,它用来保存ODBC数据源的配置。这个文件用于定义应用程序如何连接到目标数据库。可以包括以下内容:
- 数据源的名称
- 驱动程序名称
- 数据库服务器的名称
- 数据库名称
- 用户名和密码等身份验证信息
综上所述,odbcinst.ini文件主要用于配置ODBC驱动程序,odbc.ini文件主要用于配置ODBC数据源。
安装 devtools 库采坑
install.packages("devtools")
过程中频繁遇到系统依赖缺少的问题,需要仔细阅读报错。
比如我需要安装
1
2
apt install libharfbuzz-dev libfribidi-dev libcurl4-openssl-dev libxml2-dev
apt install libfreetype6-dev libpng-dev libtiff5-dev libjpeg-dev libgit2-dev
像 stringr 等依赖库需要从 github 上下载东西,如果需要代理,则运行以下代码(注意,访问清华源也会走代理):
1
2
3
4
5
6
7
8
9
# 设置 curl 代理
Sys.setenv(https_proxy="http://0.0.0.0:7890", http_proxy="http://0.0.0.0:7890")
# 安装库
install.packages("devtools", method = "libcurl")
# install.packages("stringr", method = "libcurl", configure.args = "--proxy http://127.0.0.1:7890")
# 取消代理
Sys.unsetenv("http_proxy")
Sys.unsetenv("https_proxy")
ODBC 连接数据库
- https://github.com/r-dbi/odbc/blob/main/README.md
- https://support.posit.co/hc/en-us/articles/115010915687
- https://solutions.posit.co/connections/db/best-practices/drivers/
- https://rstudio.github.io/rstudio-extensions/rstudio-connections.html
连接 SQLite
apt-get install unixodbc unixodbc-dev libsqliteodbc
1
2
library(DBI)
con <- dbConnect(odbc::odbc(), .connection_string = "Driver={SQLite3};Database=/home/rserver/test.db3;"
它会自动创建、追加 /etc/odbcinst.ini
配置文件:
1
2
3
4
5
6
7
8
9
10
11
[SQLite]
Description=SQLite ODBC Driver
Driver=libsqliteodbc.so
Setup=libsqliteodbc.so
UsageCount=1
[SQLite3]
Description=SQLite3 ODBC Driver
Driver=libsqlite3odbc.so
Setup=libsqlite3odbc.so
UsageCount=1
但注意,它使用的 SQLite3 似乎相当老旧,从而不支持识别用新的 SQLite3 建表的 strict,也不支持 PRAGMA。
所以,只建议使用它来存储新数据。以下是一个测试:
1
2
3
4
5
6
dbGetQuery(con, "CREATE TABLE t1 (a INT);")
dbGetQuery(con, "INSERT INTO t1 VALUES (1);")
t1 <- dbGetQuery(con, "SELECT * FROM t1;")
t1
# a
#1 1
你最好手动创建 /etc/odbc.ini
配置文件,它给你的数据库数据一个名字:
1
2
3
[Sqlite3-test]
Driver = SQLite3
Database = /home/rserver/test.db3
Sqlite3-test
是给数据库起的名字(用作 ODBC 的 DNS),Driver
的值是 /etc/odbcinst.ini
里定义的数据库软件的名称,Database
是数据库。每个数据库软件提供的 ODBC 似乎有自己的识别方式,见 unixODBC 文档。
在 RStudio 里面,有一个 Connections 标签页,用来通过 ODBC 连接数据库,如果你配置了 odbcinst.ini
和 odbc.ini
文件,就会有:
连接 Clickhouse
注意:clickhouse-odbc 仓库的 releases 页面的预构建很可能无法工作,在我的机器上出现 file not found 问题,如果 .so 文件的确存在那个路径,这表明你需要源码构建才能解决。
1
2
3
4
5
6
7
8
9
10
11
12
13
# 可能需要 python python-pip python-pyodbc,看构建检查的情况
sudo apt-get install -y build-essential cmake perl libdbi-perl libdbd-odbc-perl python3 python3-pip python3-pyodbc python3-setuptools
git clone --recursive git@github.com:ClickHouse/clickhouse-odbc.git
cd clickhouse-odbc
mkdir build
cd build
# Configuration options for the project can be specified in the next command in a form of '-Dopt=val'
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
cmake --build . --config RelWithDebInfo
在 clickhouse-odbc/build/driver
有所需的链接库,然后参考 clickhouse-odbc/packaging
下面有 odbc.ini.sample
和 odbcinst.ini.sample
示例。
在其 README 里也有列出 unixODBC 配置文件的参考资料。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# odbcinst.ini
[ODBC Drivers]
ClickHouse ODBC Driver (ANSI) = Installed
ClickHouse ODBC Driver (Unicode) = Installed
[ClickHouse ODBC Driver (ANSI)]
Description = ODBC Driver (ANSI) for ClickHouse
Driver = /home/rserver/clickhouse-odbc/build/driver/libclickhouseodbc.so
Setup = /home/rserver/clickhouse-odbc/build/driver/libclickhouseodbc.so
UsageCount = 1
[ClickHouse ODBC Driver (Unicode)]
Description = ODBC Driver (Unicode) for ClickHouse
Driver = /home/rserver/clickhouse-odbc/build/driver/libclickhouseodbcw.so
Setup = /home/rserver/clickhouse-odbc/build/driver/libclickhouseodbcw.so
UsageCount = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# odbc.ini
[ODBC Data Sources]
ClickHouse DSN (ANSI) = ClickHouse ODBC Driver (ANSI)
ClickHouse DSN (Unicode) = ClickHouse ODBC Driver (Unicode)
[ClickHouse DSN (ANSI)]
Driver = ClickHouse ODBC Driver (ANSI)
Description = DSN (localhost) for ClickHouse ODBC Driver (ANSI)
[ClickHouse DSN (Unicode)]
Driver = ClickHouse ODBC Driver (Unicode)
Description = DSN (localhost) for ClickHouse ODBC Driver (Unicode)
[rustdx]
Driver = ClickHouse ODBC Driver (Unicode)
Description = DSN (localhost) for ClickHouse ODBC Driver (Unicode)
Url = http://localhost:8123/query?database=rustdx