as.name() 不能用作参数

as.name() doesn't work as an argument

提问人:Robert Hadow 提问时间:1/13/2016 最后编辑:Rich ScrivenRobert Hadow 更新时间:8/7/2018 访问量:6709

问:

我构建了一个函数,其返回值根据其内容命名。Using 在控制台中有效,但不能作为函数参数。as.name()

x <- "newNameforIris"
assign(x, iris)
as.name(x)
# [1] newNameforIris
head(newNameforIris) # gives familiar results (not included)
save(as.name(x), file = "nnfi.bin")
# [1] Error in save(as.name(x), file = "nnfi.bin") : object ‘as.name(x)’ not found

我也试过了,但无济于事。在函数执行之前,我不知道对象的名称,所以我被困在没有或替代方案的情况下。eval.promises = FALSEas.name()

R 重命名

评论

0赞 Rich Scriven 1/13/2016
查看文档,特别是参数save()list
0赞 IanRiley 8/7/2018
@RobertHadow,请考虑我对你老问题但实际上没有答案的回答。干杯

答:

0赞 RJ- 1/13/2016 #1

这是因为 的类是 。as.name(x)name

class(as.name(x))
# [1] "name"

尝试:

save(get(x), file = "nnfi.bin")

评论

1赞 Rich Scriven 1/13/2016
你为什么不这样做呢?save(list = x, ...)
0赞 RJ- 1/13/2016
抱歉,我之前的回答只会将 newNameforIris 保存到文件中。当前答案应保存正确的数据。如果仍然遇到错误,则可能需要跟踪对象所在的环境网络,并在 .get
0赞 Robert Hadow 4/5/2017
我尝试了结果:当 x 是字符名称而 df 是对象时,什么对我有用:我的观察:并且在 but 的左侧工作得不太好,工作正常。save(get(x), file = "nnfi.bin")object get(x) not foundassign(x, iris)save(list = x, file = "nnfi.bin")get(x)eval(parse(text = x))<-assign(x, iris)exists(x)
2赞 IanRiley 8/7/2018 #2

我在被问到这个问题 2.5 年后发现了这个问题,因为没有令人满意的答案,所以我调查了这个问题。这是我的发现。

调查:

失败重现,但问题不仅仅是.as.name()

x <- "newNameforIris"
assign(x, iris)
as.name(x)
head(newNameforIris) # as expected
save(as.name(x), file = "nnfi.bin")
# Error in save(as.name(x), file = NULL) : object ‘as.name(x)’ not found
save(as.character(x), file = "nnfi.bin")
# Error in save(as.character(x), file = NULL) : object ‘as.character(x)’ not found
save(eval(as.name(x)), file = "nnfi.bin")
# Error in save(eval(as.name(x)), file = "nnfi.bin") : object ‘eval(as.name(x))’ not found

以下操作成功。

y <- as.name(x)
save(y, file = "nnfi.bin")
save("x", file = "nnfi.bin")
save(list=c("x"), file = "nnfi.bin")
save(list=c(as.character(as.name(x))), file = "nnfi.bin")

结论:

的参数只能接受符号和字符串,就像帮助文件所说的那样,“要保存的对象的名称(作为符号或字符串)”。...save()

因此,让我们看看如何处理.只需输入,而不是。save()...savesave()

save
#....
#     names <- as.character(substitute(list(...)))[-1L]
#     list <- c(list, names)
#....

现在,让我们用上面的其他失败测试来测试它。as.name(x)

fx <- function(..., list = character()) {
     names <- as.character(substitute(list(...)))[-1L]
     list <- c(list, names)
     return(list)
     }

fx(as.name(x))       # [1] "as.name(x)"
fx(as.character(x))  # [1] "as.character(x)"
fx(eval(as.name(x))) # [1] "eval(as.name(x))"

答:

参数中的项不会被计算,而是转换为字符串,因此除非这些字符串与现有对象相同,否则函数调用将失败。...save()

建议:

使用以下命令。

x <- as.name(x)
save(x, file = "nnfi.bin")