将任何 R 变量的值转换为字符串

Convert any R variable's value to string

来自 Java/Scala,我一直在努力弄清楚如何将任何值转换为等效的字符串。

基本上,我想获取您在 R REPL 中看到的输出并将其用作字符串。

myFunc <- function(x) { x + 1}
myFunc
#function(x) { x + 1}

其他情况同SparkR:

sc
#Java ref type org.apache.spark.api.java.JavaSparkContext id 0

我试过使用 toString()as.character() 等选项,但都失败了:

toString(myFunc)
#Error in paste(x, collapse = ", ") :
#  cannot coerce type 'closure' to vector of type 'character'

toString(sc)
#Error in as.vector(x, "character") :
#  cannot coerce type 'environment' to vector of type 'character'

我可以这样破解:

rawString <- function(obj) {
  tmp <- "/tmp/rawString.txt"
  if (file.exists(tmp)) file.remove(tmp)
  sink(tmp)
  print(obj)
  sink()
  dataString <- paste(readLines(tmp))
  if (file.exists(tmp)) file.remove(tmp)
  trimws(dataString)
}
function(obj) {
  tmp <- "/tmp/rawString.txt"
  if (file.exists(tmp)) file.remove(tmp)
  sink(tmp)
  print(obj)
  sink()
  dataString <- paste(readLines(tmp))
  if (file.exists(tmp)) file.remove(tmp)
  trimws(dataString)
}


rawString(sc)
#[1] "Java ref type org.apache.spark.api.java.JavaSparkContext id 0"

rawString(myFunc)
#[1] "function(x) { x + 1}"

但是,我想避免依赖 sink() 写入和读取文件 。有没有办法获得像 REPL 打印出来的字符串表示形式?

尝试capture.output。它本质上是您的 rawString,但已内置。

capture.output(myFunc)
[1] "function(x) { x + 1}"

不幸的是我不能代表 sparkTable 因为我没有。

您也可以考虑 ?dput,这是一种很好的方式,可以让用户复制粘贴到他们的控制台以重新创建您的变量,但不会转换为字符串(例如 dput(iris) --> 如果我将其复制粘贴到我的终端中,我会得到你所得到的)。