ฉันต้องการระงับเอาต์พุตของคำสั่งเดียว (ในกรณีนี้คือapplyฟังก์ชัน)
เป็นไปได้ไหมที่จะทำโดยไม่ใช้sink()? ฉันพบวิธีแก้ปัญหาที่อธิบายไว้ด้านล่าง แต่ต้องการทำในบรรทัดเดียวถ้าเป็นไปได้
ฉันต้องการระงับเอาต์พุตของคำสั่งเดียว (ในกรณีนี้คือapplyฟังก์ชัน)
เป็นไปได้ไหมที่จะทำโดยไม่ใช้sink()? ฉันพบวิธีแก้ปัญหาที่อธิบายไว้ด้านล่าง แต่ต้องการทำในบรรทัดเดียวถ้าเป็นไปได้
capture.output. หรือใช้*_plyจากแพ็คเกจ plyr
lapplyโดยไม่มีเอาต์พุตการพิมพ์ "l_ply" จากplyrแพ็คเกจของเขาน่าจะเป็นตัวเลือกที่เหมาะสมที่สุด
คำตอบ:
ไม่ชัดเจนว่าทำไมคุณถึงต้องการทำโดยไม่ใช้sinkแต่คุณสามารถตัดคำสั่งใด ๆ ในinvisible()ฟังก์ชันและจะระงับเอาต์พุต ตัวอย่างเช่น:
1:10 # prints output
invisible(1:10) # hides it
มิฉะนั้นคุณสามารถรวมสิ่งต่างๆไว้ในบรรทัดเดียวด้วยอัฒภาคและวงเล็บ:
{ sink("/dev/null"); ....; sink(); }
invisible()ระงับการพิมพ์นิพจน์เท่านั้นไม่ใช่sink()ซับเดียว
apply invisible(apply(matrix(1:10), 1, as.numeric))
{ sink("/dev/null"); ....; sink(); }แน่นอนผมต้องการcapture.outputเป็นcapture.outputอย่างมีประสิทธิภาพไม่ตรงกับข้างต้นเป็นเพียงแค่ดีขึ้นมาก (มีลักษณะที่เป็นแหล่งที่มาจะเรียกว่าเป็นอ่างล้างจานในแฟชั่นดังกล่าวข้างต้นบวกบางสิ่งที่ดีรอบ)
idwฟังก์ชันภายใต้ Windows ฉันคิดว่าทางออกที่ดีที่สุดคือใช้sink
ใช้capture.output()ฟังก์ชัน มันทำงานได้ดีมากเหมือนการพิมพ์ครั้งเดียวsink()และแตกต่างinvisible()คือสามารถระงับได้มากกว่าการพิมพ์ข้อความ ตั้งค่าอาร์กิวเมนต์ของไฟล์เป็น/dev/nullUNIX หรือNULบน windows ตัวอย่างเช่นการพิจารณาบันทึกของ Dirk:
> invisible(cat("Hi\n"))
Hi
> capture.output( cat("Hi\n"), file='NUL')
>
capture.output(x <- log(2))และหลังจากนั้นxมีค่าเป็นlog(2)...
คุณสามารถใช้ "capture.output" ดังด้านล่าง สิ่งนี้ช่วยให้คุณใช้ข้อมูลในภายหลัง:
log <- capture.output({
test <- CensReg.SMN(cc=cc,x=x,y=y, nu=NULL, type="Normal")
})
test$betas
ฟังก์ชั่นต่อไปนี้ควรทำในสิ่งที่คุณต้องการ:
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"
R จะพิมพ์เฉพาะผลลัพธ์ของนิพจน์ที่ไม่ได้กำหนดโดยอัตโนมัติดังนั้นเพียงแค่กำหนดผลลัพธ์ของapplyตัวแปรให้กับตัวแปรก็จะไม่ถูกพิมพ์ออกมา
print()หรือcat()อยู่ในฟังก์ชันที่ไปที่หน้าจอไม่ใช่เพื่อมอบหมาย
ในกรณีที่ใครก็ตามที่มาถึงที่นี่และกำลังมองหาวิธีแก้ปัญหาที่เกี่ยวข้องกับ RMarkdown สิ่งนี้จะระงับผลลัพธ์ทั้งหมด:
```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({
# Your code goes here
2 * 2
# etc
# etc
})})
```
โค้ดจะทำงาน แต่ผลลัพธ์จะไม่ถูกพิมพ์ลงในเอกสาร HTML
ทำให้ความคิดเห็นของ 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)
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