ปราบปรามเอาต์พุตของฟังก์ชัน


91

ฉันต้องการระงับเอาต์พุตของคำสั่งเดียว (ในกรณีนี้คือapplyฟังก์ชัน)

เป็นไปได้ไหมที่จะทำโดยไม่ใช้sink()? ฉันพบวิธีแก้ปัญหาที่อธิบายไว้ด้านล่าง แต่ต้องการทำในบรรทัดเดียวถ้าเป็นไปได้

วิธีการปราบปรามเอาต์พุต


2
คุณสามารถอธิบายความหมายของการ "ทำแบบนี้ในบรรทัด" ได้หรือไม่ มิฉะนั้นคำถามที่คุณอ้างถึงจะให้คำตอบอยู่แล้วและนี่เป็นคำถามที่ซ้ำกัน
Dirk Eddelbuettel

1
โซลูชันนี้ต้องการสามบรรทัดหนึ่งเอาต์พุตการเปลี่ยนทิศทางคำสั่งและอีกบรรทัดเพื่อเปิดเอาต์พุตอีกครั้ง
Tor

8
หรือใช้capture.output. หรือใช้*_plyจากแพ็คเกจ plyr
hadley

1
ฉันข้อเสนอแนะประการที่สองของ Hadley - หากคุณพยายามเรียกใช้ฟังก์ชันใช้งานจริง ๆ เช่นlapplyโดยไม่มีเอาต์พุตการพิมพ์ "l_ply" จากplyrแพ็คเกจของเขาน่าจะเป็นตัวเลือกที่เหมาะสมที่สุด
Sharpie

คำตอบ:


93

ไม่ชัดเจนว่าทำไมคุณถึงต้องการทำโดยไม่ใช้sinkแต่คุณสามารถตัดคำสั่งใด ๆ ในinvisible()ฟังก์ชันและจะระงับเอาต์พุต ตัวอย่างเช่น:

1:10 # prints output
invisible(1:10) # hides it

มิฉะนั้นคุณสามารถรวมสิ่งต่างๆไว้ในบรรทัดเดียวด้วยอัฒภาคและวงเล็บ:

{ sink("/dev/null"); ....; sink(); }

5
ลอง "ล่องหน (cat (" Hi \ n "))" - invisible()ระงับการพิมพ์นิพจน์เท่านั้นไม่ใช่sink()ซับเดียว
Dirk Eddelbuettel

2
ถูกต้อง แต่ฉันคิดว่าตรงกับความต้องการของผู้ถามเว้นแต่ว่าฉันจะพลาดอะไรบางอย่างในคำถาม ...
เชน

1
ตัวอย่างเช่นนี้ยับยั้งการกลับมาของเป็นต่อคำถาม:apply invisible(apply(matrix(1:10), 1, as.numeric))
เชน

แทนที่จะ{ sink("/dev/null"); ....; sink(); }แน่นอนผมต้องการcapture.outputเป็นcapture.outputอย่างมีประสิทธิภาพไม่ตรงกับข้างต้นเป็นเพียงแค่ดีขึ้นมาก (มีลักษณะที่เป็นแหล่งที่มาจะเรียกว่าเป็นอ่างล้างจานในแฟชั่นดังกล่าวข้างต้นบวกบางสิ่งที่ดีรอบ)
คุกกี้

3
ไม่ทำงานกับidwฟังก์ชันภายใต้ Windows ฉันคิดว่าทางออกที่ดีที่สุดคือใช้sink
TMS

58

ใช้capture.output()ฟังก์ชัน มันทำงานได้ดีมากเหมือนการพิมพ์ครั้งเดียวsink()และแตกต่างinvisible()คือสามารถระงับได้มากกว่าการพิมพ์ข้อความ ตั้งค่าอาร์กิวเมนต์ของไฟล์เป็น/dev/nullUNIX หรือNULบน windows ตัวอย่างเช่นการพิจารณาบันทึกของ Dirk:

> invisible(cat("Hi\n"))
Hi

> capture.output( cat("Hi\n"), file='NUL')
> 

10
ใช้ไม่ได้ถ้าคุณต้องการใช้สิ่งนี้กับฟังก์ชันที่คืนค่าบางค่าและคุณต้องการใช้ค่านี้
TMS

8
@TMS มีอะไรเปลี่ยนแปลงบ้างในช่วงสองสามเดือนที่ผ่านมา? ฉันเพิ่งทดสอบเพื่อใช้ค่าที่ส่งคืนโดยฟังก์ชันและใช้งานได้ ... capture.output(x <- log(2))และหลังจากนั้นxมีค่าเป็นlog(2)...
drmariod

10

คุณสามารถใช้ "capture.output" ดังด้านล่าง สิ่งนี้ช่วยให้คุณใช้ข้อมูลในภายหลัง:

log <- capture.output({
  test <- CensReg.SMN(cc=cc,x=x,y=y, nu=NULL, type="Normal")
})

test$betas

10

ฟังก์ชั่นต่อไปนี้ควรทำในสิ่งที่คุณต้องการ:

hush=function(code){
  sink("NUL") # use /dev/null in UNIX
  tmp = code
  sink()
  return(tmp)
}

ตัวอย่างเช่นกับฟังก์ชันที่นี่:

foo=function(){
  print("BAR!")
  return(42)
}

วิ่ง

x = hush(foo())

จะกำหนดให้ 42 เป็น x แต่จะไม่พิมพ์ "BAR!" ถึง STDOUT

หมายเหตุกว่าในระบบปฏิบัติการ UNIX คุณจะต้องแทนที่ "NUL" ด้วย "/ dev / null"


นี่เป็นคำตอบเดียวที่ทำในสิ่งที่ฉันต้องการ
tomka

สิ่งที่ฉันต้องการเช่นกัน
gaspar

9

R จะพิมพ์เฉพาะผลลัพธ์ของนิพจน์ที่ไม่ได้กำหนดโดยอัตโนมัติดังนั้นเพียงแค่กำหนดผลลัพธ์ของapplyตัวแปรให้กับตัวแปรก็จะไม่ถูกพิมพ์ออกมา


4
ฟังก์ชันบางอย่างมีprint()หรือcat()อยู่ในฟังก์ชันที่ไปที่หน้าจอไม่ใช่เพื่อมอบหมาย
keithpjolley

3

ในกรณีที่ใครก็ตามที่มาถึงที่นี่และกำลังมองหาวิธีแก้ปัญหาที่เกี่ยวข้องกับ RMarkdown สิ่งนี้จะระงับผลลัพธ์ทั้งหมด:

```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({

# Your code goes here
2 * 2
# etc
# etc


})})
```

โค้ดจะทำงาน แต่ผลลัพธ์จะไม่ถูกพิมพ์ลงในเอกสาร HTML


1

ทำให้ความคิดเห็นของ Hadley เป็นคำตอบ (หวังว่าจะทำให้มองเห็นได้ดีขึ้น) การใช้งานของตระกูลสมัครโดยไม่ต้องพิมพ์เป็นไปได้ด้วยการใช้plyrแพ็คเกจ

x <- 1:2
lapply(x, function(x) x + 1)
#> [[1]]
#> [1] 2
#> 
#> [[2]]
#> [1] 3

plyr::l_ply(x, function(x) x + 1)

สร้างเมื่อ 2020-05-19 โดยแพ็คเกจ reprex (v0.3.0)


0
invisible(cat("Dataset: ", dataset, fill = TRUE))
invisible(cat(" Width: " ,width, fill = TRUE))
invisible(cat(" Bin1:  " ,bin1interval, fill = TRUE))
invisible(cat(" Bin2:  " ,bin2interval, fill = TRUE))
invisible(cat(" Bin3:  " ,bin3interval, fill = TRUE))

สร้างเอาต์พุตโดยไม่มี NULL ที่ท้ายบรรทัดหรือในบรรทัดถัดไป

Dataset:  17 19 26 29 31 32 34 45 47 51 52 59 60 62 63
Width:  15.33333

Bin1:   17 32.33333
Bin2:   32.33333 47.66667
Bin3:   47.66667 63
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.