首页 【R 语言】Ubuntu 安装 RStudio Server 以及踩坑记录
文章
取消

【R 语言】Ubuntu 安装 RStudio Server 以及踩坑记录

很久没有使用 R 语言了,突然发现 RStudio 公司 改名 了,主页为 posit.co

RStudio Server 官方下载说明:https://posit.co/download/rstudio-server/

步骤 1:安装 R 语言和 Rserver

注意:安装 R 语言的命令不建议直接使用我这里写的,因为 CRAN 源被设置成 cloud.r-project.org

建议直接参考 清华镜像源的安装和设置

  1. 安装 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/"
  1. 安装 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 用户管理工具 useradduserdel 管理帐号
  • 每个用户有自己的 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 语言中显示源代码,可以使用以下方法:

  1. View()函数:View() 函数可以在新的窗口中显示变量、数据集或函数的源代码。例如,要查看 data 这个数据集的源代码,可以输入 View(data)。
  2. head()函数:head() 函数可以显示数据集的前几行,默认显示前6行。例如,要查看 data 数据集的前10行,可以输入 head(data, 10)。
  3. print()函数:print() 函数可以打印对象的完整信息和源代码。例如,要查看函数 foo 的源代码,可以输入 print(foo)。
  4. edit()函数:edit() 函数可以在编辑器中打开一个对象的源代码,使您可以更方便地编辑代码。例如,要编辑函数 foo 的源代码,可以输入 edit(foo)。
  5. 使用代码编辑器:R Studio 和其他一些集成开发环境(IDE)提供了代码编辑器,您可以在其中创建和编辑 R 语言的脚本文件。这些编辑器还提供了代码高亮、代码提示、自动格式化等功能,使您更轻松地编写代码。

以上是在 R 语言中显示源代码的几种常用方法。请注意,您需要在 R 语言的控制台或脚本文件中输入这些命令来使用它们。

R 语言如何写一个 library

在 R 语言中,可以通过编写自定义 package(包)的方式来创建自己的 library。以下是创建一个 library 的基本步骤:

  1. 在 R 语言的控制台或 R Studio 的 Console 窗口中,输入以下命令,创建一个 package:
1
2
library(devtools)
create_package("mylibrary")

这将创建一个名为 mylibrary 的新 package 文件夹,其中包含一些默认文件和目录。

  1. 进入 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.
  1. 向 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)
}
  1. 构建 package 文件,以便将您的函数打包到可供其他人使用的二进制文件中。使用以下命令进行构建:
1
2
library(devtools)
build("mylibrary")

这将在 package 文件夹中创建一个 tar.gz 文件,其中包含您的 package。

  1. 将 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 语言包时,如果您的网络环境需要使用代理服务器,可以通过以下方式来设置代理:

  1. 直接在 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 替换为您的代理服务器地址和端口号。

  1. 设置全局代理:

您还可以在环境变量中设置 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 语言中,可以使用以下命令来设置环境变量:

  1. 临时设置环境变量:在 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”。

请注意,此方法所设置的环境变量将仅在当前会话中有效,一旦会话结束会被删除。

  1. 设置全局环境变量:如果你希望 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 连接数据库

连接 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.iniodbc.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.sampleodbcinst.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

本文由作者按照 CC BY 4.0 进行授权

使用 ktra 搭建私人 Cargo registry

【R 语言】在线书籍