r - 如何获取在 R 中重新创建数据框的代码?

标签 r reflection metaprogramming

我有一些数据框对象。

我想查看重新创建该数据框对象的代码。

例如,这是我的数据框

str(ror)
# 'data.frame':   2 obs. of  2 variables:
#  $ from: Factor w/ 2 levels "x","x1": 2 1
#  $ to  : Factor w/ 2 levels "x2","y": 1 2

我想通过调用一些函数来打印以下代码,例如:recreate(ror)

recreate(ror)
# data.frame(from = c('x1', 'x'), to = c('x2', 'y'))

我记得有一个函数可以从 ror 获取此代码,但我找不到该函数的确切名称或在 google 中搜索的确切术语来找到它?

最佳答案

也许是这样:

recreate <- function(DF) {
  res <- textConnection("foo", "w")

  dput(lapply(DF, 
              function(x) if(is.factor(x)) as.character(x) else x), 
       control = c("keepNA", "keepInteger"), file = res)

  close(res)

  foo <- sub("list", "data.frame", foo, fixed = TRUE)

  parse(text = paste(foo, collapse = "\n"))[[1]]
}

newDF <- recreate(iris)

all.equal(eval(newDF), iris)
#[1] TRUE

print(newDF)
#data.frame(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 
#    5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 
#    5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5, 5, 5.2, 5.2, 4.7, 4.8, 5.4, 
#    5.2, 5.5, 4.9, 5, 5.5, 4.9, 4.4, 5.1, 5, 4.5, 4.4, 5, 5.1, 
#    4.8, 5.1, 4.6, 5.3, 5, 7, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 
#    6.6, 5.2, 5, 5.9, 6, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 
#    6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6, 5.7, 5.5, 5.5, 5.8, 
#    6, 5.4, 6, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5, 5.6, 5.7, 
#    5.7, 6.2, 5.1, 5.7, 6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 
#    6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6, 
#    6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 
#    6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6, 6.9, 6.7, 6.9, 5.8, 6.8, 
#    6.7, 6.7, 6.3, 6.5, 6.2, 5.9), Sepal.Width = c(3.5, 3, 3.2, 
#    3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3, 3, 4, 4.4, 
#    3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3, 3.4, 3.5, 
#    3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3, 3.4, 
#    3.5, 2.3, 3.2, 3.5, 3.8, 3, 3.8, 3.2, 3.7, 3.3, 3.2, 3.2, 
#    3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2, 3, 2.2, 2.9, 2.9, 
#    3.1, 3, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3, 2.8, 3, 
#    2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3, 3.4, 3.1, 2.3, 3, 2.5, 2.6, 
#    3, 2.6, 2.3, 2.7, 3, 2.9, 2.9, 2.5, 2.8, 3.3, 2.7, 3, 2.9, 
#    3, 3, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3, 2.5, 2.8, 3.2, 3, 
#    3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3, 2.8, 
#    3, 2.8, 3.8, 2.8, 2.8, 2.6, 3, 3.4, 3.1, 3, 3.1, 3.1, 3.1, 
#    2.7, 3.2, 3.3, 3, 2.5, 3, 3.4, 3), Petal.Length = c(1.4, 
#    1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 
#    1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1, 1.7, 1.9, 
#    1.6, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 
#    1.4, 1.3, 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 
#    1.4, 4.7, 4.5, 4.9, 4, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 
#    4.2, 4, 4.7, 3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4, 4.9, 4.7, 
#    4.3, 4.4, 4.8, 5, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 
#    4.7, 4.4, 4.1, 4, 4.4, 4.6, 4, 3.3, 4.2, 4.2, 4.2, 4.3, 3, 
#    4.1, 6, 5.1, 5.9, 5.6, 5.8, 6.6, 4.5, 6.3, 5.8, 6.1, 5.1, 
#    5.3, 5.5, 5, 5.1, 5.3, 5.5, 6.7, 6.9, 5, 5.7, 4.9, 6.7, 4.9, 
#    5.7, 6, 4.8, 4.9, 5.6, 5.8, 6.1, 6.4, 5.6, 5.1, 5.6, 6.1, 
#    5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 5.9, 5.7, 5.2, 5, 5.2, 
#    5.4, 5.1), Petal.Width = c(0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 
#    0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 
#    0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 
#    0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 
#    0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2, 1.4, 1.5, 1.5, 1.3, 
#    1.5, 1.3, 1.6, 1, 1.3, 1.4, 1, 1.5, 1, 1.4, 1.3, 1.4, 1.5, 
#    1, 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 
#    1, 1.1, 1, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4, 
#    1.2, 1, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3, 2.5, 1.9, 2.1, 1.8, 
#    2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2, 1.9, 2.1, 2, 2.4, 2.3, 1.8, 
#    2.2, 2.3, 1.5, 2.3, 2, 2, 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, 
#    1.9, 2, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 
#    1.9, 2.3, 2.5, 2.3, 1.9, 2, 2.3, 1.8), Species = c("setosa", 
#    "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", 
#    "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", 
#    "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", 
#    "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", 
#    "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", 
#    "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", 
#    "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", 
#    "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", 
#    "setosa", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", 
#    "versicolor", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica", "virginica", "virginica", "virginica", "virginica", 
#    "virginica"))

关于r - 如何获取在 R 中重新创建数据框的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36198485/

相关文章:

php:使用反射获取变量类型提示

ruby - 如何检查 ruby​​ 方法中可选参数的默认值是多少?

ruby - 通过符号调用 setter 方法

python - __new__ 在分数模块中

python - 使用 Pandas 或 Numpy 的 n 维滑动窗口

R Shiny : Uploading a file on button click

scala - 如何在运行时访问案例类字段上定义的注释

r - 如何否定lookbehind正则表达式?

R split apply 与 dplyr 结合使用 - 如何保持切片产生的 NA

struct - Racket:从结构中提取字段 ID