【问题标题】:R: How to pass a variable through two functions retaining its original name?R:如何通过两个保留其原始名称的函数传递一个变量?
【发布时间】:2015-04-03 15:15:53
【问题描述】:

这是我的情况。我有一个 data.frame,比如说:DF <- data.frame(....)

现在我想使用 SASxport::write.xport(DF, ...) 将此 DF 导出到 SAS 传输文件

函数 write.xport 采用变量名称并使用它来命名 SAS 数据集。因此,上面的代码将生成 SAS 数据集,其中包含一个名为“DF”的表。 好的。只要好。

现在我想将调用 SASxport 封装在另一个执行一些初始任务的函数中。

fn <- function(DataFrame) {
.... do something ....
write.xport( DataFrame, .... )
}

fn(DF)

现在问题来了。生成的 SAS 数据集包含一个名为“DataFrame”的表,而不是“DF”。

所以,我尝试获取数据集的原始名称并以某种方式将其传递给 write.xport:

fn <- function(DataFrame) {
.... do something ....

params <- as.list(match.call()[-1])
name <- as.character(params$DataFrame)

write.xport( eval(parse(text=name)), .... )
}

fn(DM)

但这不起作用。它会创建名称无效的 SAS 文件(因此它肯定不是“DM”),使文件无法被 SAS 读取。 eval/substitute 也不能正常工作(SAS 中的名称是“eval_sub”)。

如何将数据集的原始名称 DF 传递给 write.xport 的内部调用?

代码应该欺骗 write.xport 函数,给她 DF,而不是 DataFrame,就像在控制台中手动编写代码一样。

这可能吗?

编辑:

好的,eval(parse(text = paste0("write.xport(", name, ........."))) 成功了。现在已经解决了。

【问题讨论】:

  • 是的,你是对的。目前我无法接受我的回答,它说我将能够在 2 天内做到这一点。

标签: r


【解决方案1】:

我建议您在这种情况下尽量避免使用eval() 函数。最好的方法是使用write.xport 函数的list= 参数。使用setNames(),您可以为对象设置任何您想要的名称。这里我还添加了一个名为name= 的参数,你可以在其中设置任何你想要的名称,但它会默认为传递给函数的变量的名称。

#test data
DF<-data.frame(a=1:10,  b=letters[1:10])

library(SASxport)

fn <- function(DataFrame, name=deparse(substitute(DataFrame))) {
    write.xport( list=setNames(list(DataFrame), name), file="test.dat")
}

fn(DF)

【讨论】:

    【解决方案2】:

    好的,eval(parse(text = paste0("write.xport(", name, ........."))) 成功了。 SAS 文件已正确生成并包含一个按要求命名的表。现在已经解决了。

    【讨论】:

    • 一般情况下尽量不要使用eval(parse(...))。尤其是当您使用的函数有一个参数可以满足您的要求时。
    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多