【问题标题】:How to pass an argument which needs quotes in an R function?如何在 R 函数中传递需要引号的参数?
【发布时间】:2021-05-25 20:10:17
【问题描述】:

这是引用的非函数部分。效果很好。

library(countrycode)
countrycode(df$iso, origin = 'iso3c', destination = 'country.name')

我正在尝试将其放入函数中,但由于 countrycode 函数无法识别没有“引号”的参数。

func <- function(df, ori, dest) {
  countrycode(df, origin = ori, destination = dest)
}

func(df$iso, iso3c, country.name)

我该如何解决这个问题?

【问题讨论】:

  • 当函数需要字符串时,为什么要传递不带引号的参数?大多数情况下,人们在不带引号的情况下传递值是因为它们是来自 data.frame 或其他执行环境的列名。选择需要不带引号的符号将使您的函数更难以编程方式使用。具有Maplapply 等功能。你确定这是一个合理的要求吗?

标签: r country-codes


【解决方案1】:

对于不带引号的输入,在base R 中转换为带有subsitute/deparse 的带引号

func <- function(df, ori, dest) {
   ori <- deparse(subsitute(ori)
   dest <- deparse(subsitute(dest)
   countrycode(df, origin = ori, destination = dest)
 }

【讨论】:

    【解决方案2】:

    如果在父环境中定义了变量 iso3ccountry.name,您的函数确实有效...

    library(countrycode)
    
    df <- data.frame(iso = c("USA", "DEU"))
    
    func <- function(df, ori, dest) {
      countrycode(df, origin = ori, destination = dest)
    }
    
    iso3c <- "iso3c"
    country.name <- "country.name"
    
    func(df$iso, iso3c, country.name)
    # [1] "United States" "Germany"
    

    但是您可能想要的是将字符串值本身传递给参数(而不是变量名,它可能不存在)...

    library(countrycode)
    
    df <- data.frame(iso = c("USA", "DEU"))
    
    func <- function(df, ori, dest) {
      countrycode(df, origin = ori, destination = dest)
    }
    
    func(df$iso, "iso3c", "country.name")
    # [1] "United States" "Germany"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多