【问题标题】:R function for extracting ESS data, "could not find function paste"用于提取 ESS 数据的 R 函数,“找不到函数粘贴”
【发布时间】:2020-01-23 11:01:32
【问题描述】:

从“essurvey”包中,我有一个数据集(作为“列表”对象),我试图从中获取所有国家/地区的所有 ESS 轮次。为了稍微有效地做到这一点,我正在尝试创建一个可以为我执行此操作的函数,但是我遇到了一些问题: 首先,如果我使用“粘贴”函数来获取对象的名称,则会收到错误消息: Error in paste: could not find function "paste<-"。 其次,当尝试使用函数设置名称只是为了查看它是否可以在没有粘贴部分的情况下工作时,它运行没有错误,但也没有任何结果。谁能看到解决方案?我感谢所有帮助!

ESS_Load <- function(N, CC){
temp <- Data[[N]]
paste(N, CC, sep = "_") <-
subset(temp, cntry == CC)
rm(temp)


}

ESS_Load(9, "NO")

【问题讨论】:

  • 语法paste(x, ...) &lt;- y没有调用函数paste(),实际上等价于x &lt;- `paste&lt;-`(x, ..., value = y),而paste&lt;-不存在。目前尚不清楚您想要的输出是什么,因为rm(temp) 在任何情况下都会返回 NULL
  • 哦,这至少可以解释,谢谢!所需的输出是名称为 CC_N 的数据帧,其中 cc 是国家代码,N 是 ESS 轮数。在数据列表对象中,所有 ESS 轮次都存储为数据框,我希望每个 country_round 都是它自己的数据框。

标签: r list function paste


【解决方案1】:

我从您的评论中了解到,您希望在调用环境中创建一个名为 {CC}_{N} 的数据框,作为函数的副作用。

可以这样实现:

# first build sample data
set.seed(1)
Data <- list(iris[sample(nrow(iris),5),], iris[sample(nrow(iris),5),])
Data
#> [[1]]
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#> 68           5.8         2.7          4.1         1.0 versicolor
#> 129          6.4         2.8          5.6         2.1  virginica
#> 43           4.4         3.2          1.3         0.2     setosa
#> 14           4.3         3.0          1.1         0.1     setosa
#> 51           7.0         3.2          4.7         1.4 versicolor
#> 
#> [[2]]
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#> 85           5.4         3.0          4.5         1.5 versicolor
#> 21           5.4         3.4          1.7         0.2     setosa
#> 106          7.6         3.0          6.6         2.1  virginica
#> 74           6.1         2.8          4.7         1.2 versicolor
#> 7            4.6         3.4          1.4         0.3     setosa

iris_Load <- function(N, CC){
  nm <- paste(CC, N, sep = "_")
  res <- subset(Data[[N]], Species == CC)
  assign(nm, res, envir = parent.frame()) # create your object with right name and value in calling environment
  invisible() # will return NULLL without printing
}

iris_Load(1, "setosa")
setosa_1
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 43          4.4         3.2          1.3         0.2  setosa
#> 14          4.3         3.0          1.1         0.1  setosa

如果您有能力执行以下操作,则可以说是更好的做法,但具有副作用的函数可能会令人惊讶,并且在大多数情况下通常不鼓励使用:

iris_Load <- function(N, CC){
  subset(Data[[N]], Species == CC)
}
setosa_1 <- iris_Load(1, "setosa")
setosa_1
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 43          4.4         3.2          1.3         0.2  setosa
#> 14          4.3         3.0          1.1         0.1  setosa
```

【讨论】:

  • 谢谢,这确实完美地解决了我的问题!如果你有时间,我能问一下为什么底部的答案会更好吗?对这一切还是陌生的,所以我尽量学习。
  • 当然,要知道函数在第一种情况下的影响,您需要了解函数,或者阅读它的代码。浏览或运行您的代码的其他用户不会立即了解对象setosa_1 已在环境中创建。第二种选择更加透明。通常具有副作用的“好”函数是那些设置选项、打开查看器、浏览网站、保存文件的函数……但是在调用环境中创建变量并不是很好的做法,因为有一种更清晰的方法。
  • 这更深入地触及了主题:adv-r.had.co.nz/Functions.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多