किसी फ़ंक्शन में भेजे जाने के बाद आर में, किसी ऑब्जेक्ट का नाम कैसे प्राप्त करें?


135

मैं इसके विपरीत की तलाश में हूं get()

एक वस्तु के नाम को देखते हुए, मैं चाहता हूं कि चरित्र स्ट्रिंग का प्रतिनिधित्व उस वस्तु से हो जो सीधे वस्तु से निकाली गई है।

मेरे द्वारा खोजे fooजा रहे फ़ंक्शन के लिए प्लेसहोल्डर होने के साथ तुच्छ उदाहरण ।

z <- data.frame(x=1:10, y=1:10)

test <- function(a){
  mean.x <- mean(a$x)
  print(foo(a))
  return(mean.x)}

test(z)

प्रिंट होगा:

  "z"

मेरे काम के आसपास, जो मेरी वर्तमान समस्या में लागू करना कठिन है:

test <- function(a="z"){
  mean.x <- mean(get(a)$x)
  print(a)
  return(mean.x)}

test("z")

35
मुझे लगता deparse(substitute(...))है कि आप क्या हैं
चेस

2
बुरा उदाहरण हालांकि चर "Z" कहा जाता है और परीक्षण करने के लिए पैरामीटर के लिए भी कहा जाता है "Z" ... मुद्रण "Z" वास्तव में आपको बता नहीं पड़ता कि आप इसे सही ढंग से तो किया था ;-)
टॉमी

@ टॉमी, इसे सुधारने की कोशिश की, लेकिन अगर आप चाहें तो संपादन में सुधार करें।
इटियेन लो-डेकेरी

getR का विपरीत है, assignलेकिन मुझे यकीन नहीं है कि आप वास्तव में क्या देख रहे हैं ...
टॉम केली

जवाबों:


160

पुराना अवतरण-विकल्प चाल:

a<-data.frame(x=1:10,y=1:10)
test<-function(z){
   mean.x<-mean(z$x)
   nm <-deparse(substitute(z))
   print(nm)
   return(mean.x)}

 test(a)
#[1] "a"   ... this is the side-effect of the print() call
#          ... you could have done something useful with that character value
#[1] 5.5   ... this is the result of the function call

संपादित करें: नए परीक्षण-ऑब्जेक्ट के साथ इसे चलाएं

नोट: यह एक स्थानीय फ़ंक्शन के अंदर सफल नहीं होगा जब सूची आइटम का एक सेट पहले तर्क से पास किया जाता है lapply(और यह तब भी विफल होता है जब किसी ऑब्जेक्ट को for-loop को दी गई सूची से पारित किया जाता है ।) आप निकालने में सक्षम होंगे। ".नाम" - -संवाद और संरचना परिणाम से प्रसंस्करण का क्रम, अगर यह एक नामित वेक्टर था जिसे संसाधित किया जा रहा था।

> lapply( list(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} )
$a
$a[[1]]
[1] "X"    ""     "1L]]"


$b
$b[[1]]
[1] "X"    ""     "2L]]"

> lapply( c(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} )
$a
$a[[1]]
[1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" ""                                            
[3] "1L]]"                                        


$b
$b[[1]]
[1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" ""                                            
[3] "2L]]"  

11
deparse(quote(var))

मेरी सहज समझ, जिसमें उद्धरण मूल्यांकन से संस्करण या अभिव्यक्ति को फ्रीज करता है और पार्स फ़ंक्शन का विलोम फ़ंक्शन है जो स्ट्रींग प्रतीक को स्ट्रिंग में वापस कर देता है


6

ध्यान दें कि प्रिंट विधियों के लिए व्यवहार भिन्न हो सकता है।

print.foo=function(x){ print(deparse(substitute(x))) }
test = list(a=1, b=2)
class(test)="foo"
#this shows "test" as expected
print(test)

#this shows 
#"structure(list(a = 1, b = 2), .Names = c(\"a\", \"b\"), class = \"foo\")"
test

मंचों पर मैंने जो अन्य टिप्पणियां देखी हैं, उनसे पता चलता है कि अंतिम व्यवहार अपरिहार्य है। यह दुर्भाग्यपूर्ण है अगर आप पैकेज के लिए प्रिंट तरीके लिख रहे हैं।


शायद यह होना चाहिए: print.foo=function(x){ cat(deparse(substitute(x))) }याprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM

1
याprint.foo=function(x){ print.default(as.list(x)) }
IRTFM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.