首页 > 解决方案 > 字符类变量在R中的对话框中打印多行

问题描述

在 R 中,我希望用户通过对话框(即svDialogs' dlgInput)提供信息。但是,为了避免用户提供双重数据,我想在提到的对话框中列出已经存在的信息。问题是,如果变量有多个数据,则会出现多行(与数据一样多)。

例如,使用以下代码:

library(svDialogs)
temp = c("one", "two", "three")
userInput <-  dlgInput(paste("Enter info (these already exist:", temp, ")"))$res

给我一个对话框,在用户输入字段上方有以下几行:

Enter info (these already exist: one)
Enter info (these already exist: two)
Enter info (these already exist: three)

鉴于,我想要的是:

Enter info (these already exist: one, two, three)

我尝试了以下 2 种替代方法,两者都给出了相同的结果paste()

sprintf("Enter a ticker (these are already loaded: %s)", temp)
stringr::str_glue("Hi Have a very nice ${temp} !")

以下替代方案几乎奏效了,但它们给了我一个奇怪"Hi Have a very nice c(\"one\", \"two\", \"three\") !"的感觉,我不知道如何c(\)去掉引号和引号:

fn$paste("Enter a ticker (these are already loaded: $temp)") #requires library(gsubfn)
stringr::str_interp("Hi Have a very nice ${temp} !")
str_interp("Hi Have a very nice ${temp} !")

我的问题:


使用的系统:

标签: r

解决方案


所有这些函数都是矢量化的,因此它们每个输入产生一个输出。您希望在将输入传递给任何这些函数之前折叠输入。这可以通过例如:toString

userInput <-  dlgInput(paste("Enter info (these already exist:", toString(temp), ")"))$res

您也可以使用paste(temp, collapse = ', ')来获得相同的结果。请注意,您仍然需要两个(嵌套)调用paste,这里单个调用是不够的。

使用“胶水”时,您可以通过glue_collapse或通过实施和使用折叠变压器来实现相同的效果。


推荐阅读