R 中的 Python f 字符串等效项?

jus*_*482 36 r

R 有相当于 Python f 字符串的东西吗?就像 Python 中的这个例子:

name = "Eric"
age = 42
f"Hello, {name}. You are {age}."

Run Code Online (Sandbox Code Playgroud)

我了解pasteand paste0,但它们要求您用逗号分隔不同的元素。我在互联网上搜索时找不到任何有关它的信息。

sta*_*rja 47

您可以使用glue

library(glue)
name <- "Eric"
age <- 42
glue('Hello, {name}. You are {age}.')
#> Hello, Eric. You are 42.
Run Code Online (Sandbox Code Playgroud)


Are*_*Too 23

sprintf是 R 标准库中最直接的选项,因此您不需要安装任何其他包或库,因为它只是底层 C 函数的包装器。不过,我承认如果您不习惯的话,语法会有点棘手。

name <- "Eric"
age <- 42
sprintf("Hello, %s. You are %s.", name, age)
Run Code Online (Sandbox Code Playgroud)

结果: [1] "Hello, Eric. You are 42."

如果您确实不喜欢那里的语法,可以尝试使用Paste0来获得相同的结果。

name <- "Eric"
age <- 42
paste0("Hello, ", name, ". You are ", age, ".")
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 5

gsubfn 包允许您为任何函数添加前缀,fn$在这种情况下,字符参数将支持使用反引号或 $ 符号的 perl 样式字符串插值(并且公式符号可用于函数参数)。

library(gsubfn)
name <- "Eric"
age <- 42
fn$plot(0, main = "Hello, `name`. You are `age`.")
Run Code Online (Sandbox Code Playgroud)

反引号内的部分可以是 R 表达式:

fn$identity("Hello, `name`. You are `age+1`.")
## [1] "Hello, Eric. You are 43."
Run Code Online (Sandbox Code Playgroud)

如果可以从字符串推断变量名称的结尾,它还支持 $ 表示法。上面的情况并非如此,因为点在变量名中是有效的,但这可以工作:

fn$c("Hello $name")
## [1] "Hello Eric"
Run Code Online (Sandbox Code Playgroud)

还可以使用同一包中的 gsubfn。这会查找由大括号括起来的字符串,然后用其中的变量名称替换其内容。

gsubfn("{(.*?)}", get, "Hello, {name}. You are {age}.")
## [1] "Hello, Eric. You are 42."
Run Code Online (Sandbox Code Playgroud)

或者可以提供一个列表作为第二个参数

L <- list(name = "Eric", age = 42)
gsubfn("{(.*?)}", L, "Hello, {name}. You are {age}.")
## [1] "Hello, Eric. You are 42."
Run Code Online (Sandbox Code Playgroud)

使用相同的列表也可以实现这一点。它避免使用 {...},并且只要名称和年龄不出现在字符串中的其他位置就可以工作。它在列表中查找单词,即由单词字符组成的子字符串。

gsubfn("\\w+", L, "Hello, name. You are age.")
## [1] "Hello, Eric. You are 42."
Run Code Online (Sandbox Code Playgroud)