Betrachten Sie diese Funktion a()
, die das Argument ausdruckt, die in übergeben wurde:Mit Ersatz() Argument Namen zu bekommen, mehrere Ebenen bis
a <- function(x) {
message("The input is ", deparse(substitute(x)))
}
a("foo")
# The input is "foo"
tmplist <- list(x1 = 1, x2=2)
a(tmplist)
# The input is tmplist
, das funktioniert. Aber wenn a()
aus einer anderen Funktion aufgerufen wird, ist es nicht mehr druckt die ursprünglichen Argumentnamen aus:
b <- function(y) {
a(y)
}
b("foo")
# The input is y
b(tmplist)
# The input is y
Eine Lösung, die zu funktionieren scheint in einer anderen substitute
zu wickeln und ein eval
:
a1 <- function(x) {
message("The input is ", deparse(eval(substitute(substitute(x)), parent.frame())))
}
a1("foo")
# The input is "foo"
tmplist <- list(x1 = 1, x2=2)
a1(tmplist)
# The input is tmplist
b1 <- function(y) {
a1(y)
}
b1("foo")
# The input is "foo"
b1(tmplist)
# The input is tmplist
Aber das scheint unelegant. Und es schlägt fehl, wenn ich einen weiteren Layer hinzufüge:
c1 <- function(z) {
b1(z)
}
c1("foo")
# The input is z
Gibt es eine gute, allgemeine Möglichkeit, das ursprüngliche Argument zu erhalten?
Ich bin kein Experte in der Handhabung von Umgebungen, aber ich denke, entweder mit 'parent.frame' zu spielen, wie es bei kohske der Fall war, oder eine globale Variable anzugeben, sind Ihre einzigen Entscheidungen. R geht nicht wie bei c durch Referenz. –