dplyr:“ ข้อผิดพลาดใน n (): ไม่ควรเรียกใช้โดยตรง”


96

ฉันกำลังพยายามทำซ้ำตัวอย่างหนึ่งในแพ็คเกจ dplyr แต่ได้รับข้อความแสดงข้อผิดพลาดนี้ ฉันคาดหวังว่าจะเห็นคอลัมน์ n ใหม่ที่สร้างขึ้นพร้อมความถี่ของการรวมกันแต่ละชุด ฉันขาดอะไรไป? ฉันตรวจสอบสามครั้งว่าโหลดแพคเกจแล้ว

 library(dplyr)
# summarise peels off a single layer of grouping
by_vs_am <- group_by(mtcars, vs, am)

by_vs <- summarise(by_vs_am, n = n())

ข้อผิดพลาดใน n (): ไม่ควรเรียกใช้ฟังก์ชันนี้โดยตรง

คำตอบ:


120

ฉันคิดว่าคุณมีdplyrและplyrโหลดในเซสชันเดียวกัน ไม่ใช่dplyr ไม่ใช่ฟังก์ชันในแพ็คเกจplyrddplydplyr

ทั้งสองdplyrและplyrมีฟังก์ชั่นsummarise/ summarize.

ดูผลลัพธ์ของconflicts()การดูวัตถุมาสก์


31
วิธีแก้ไขคือให้แน่ใจว่าคุณโหลดplyrก่อน
hadley

16
ในฐานะที่เป็น @ User1257894 กล่าวว่าการใช้งานกับแพคเกจบางอย่างเช่นนี้summarize dplyr::summarize(count = n())
Rafa Barragan

39

ดังที่ได้กล่าวไว้ในคำตอบก่อนหน้านี้คุณอาจมีความขัดแย้งระหว่าง plyr และ dplyr คุณสามารถรันคำสั่งนี้เพื่อยกเลิกการโหลดแพ็กเกจ plyr

detach("package:plyr", unload=TRUE) 

จากนั้นคุณสามารถดำเนินการต่อได้ตามที่คาดไว้

library(dplyr) 
...
summarise(n = n()) 

ความขัดแย้งอยู่ระหว่างสรุปหรือสรุป ฉันยังโหลดplyrและdplyrแพ็กเกจในโปรเจ็กต์ของฉันโดยไม่ได้ตั้งใจและตระหนักถึงความขัดแย้งนี้ เพื่อนร่วมงานที่ดี
Manoj Kumar

26

เพื่อหลีกเลี่ยงความสับสนกับฟังก์ชันการกำบังควรใช้ข้อกำหนด "package :: function" ดังตัวอย่างด้านล่าง:

delay <- dplyr::summarise(by_tailnum, 
  count = n(), 
  dist = mean(distance, na.rm = TRUE), 
  delay = mean(arr_delay, na.rm = TRUE))

8

ในอีกกรณีหนึ่งข้อผิดพลาดนี้เกิดขึ้นในรหัสต่อไปนี้

library(dplyr) # dplyr 0.5.0
library(lazyeval)

df <- data_frame(group = c(1, 2, 2, 3, 3, 3))

g <- "group"

df %>%
  group_by_(g) %>%
  summarise_(
    n = n(),
    sum = interp(~sum(col, na.rm = TRUE), col = as.name(g))
  )
# Error in n() : This function should not be called directly

สามารถแก้ไขได้ดังนี้

df %>%
  group_by_(g) %>%
  summarise_(
    n = "n()",
    sum = interp(~sum(col, na.rm = TRUE), col = as.name(g))
  )
# A tibble: 3 × 3
# group     n   sum
# <dbl> <int> <dbl>
# 1     1     1     1
# 2     2     2     4
# 3     3     3     9

0

ประสบปัญหาที่คล้ายกันขณะเรียกใช้รหัสตามบล็อกที่กล่าวถึงแล้วเรียกใช้โซลูชันในการแยกออก ("package: plyr", unload = TRUE)

บล็อก: https://www.analyticsvidhya.com/blog/2017/09/comparative-stock-analysis/

Master_Data_AutoCorrelations<-Master_Data_lags %>%
  gather(key = "lag", value = "lag_value", -c(Stock,Date, Close)) %>%
  mutate(lag = str_sub(lag, start = 5) %>% as.numeric) %>%
  group_by(Stock, lag) %>%
  summarize(
    cor = cor(x = Close, y = lag_value, use = "pairwise.complete.obs"),
    cutoff_upper = 2/(n())^0.5,
    cutoff_lower = -2/(n())^0.5
  )

การโพสต์การถอดออกเมื่อรันโค้ดด้านบนอีกครั้งมันทำงานได้ดีแม้ว่าจะได้รับข้อความเตือนตามด้านล่างไม่แน่ใจว่า plyr ถูกยกเลิกการโหลดหรือไม่และโค้ดจะดำเนินการอย่างไรอย่างถูกต้อง?

ข้อความเตือน: ไม่สามารถยกเลิกการโหลดเนมสเปซ 'plyr' ได้: เนมสเปซ 'plyr' ถูกนำเข้าโดย 'reshape2', 'scale', 'broom', 'ggplot2' จึงไม่สามารถยกเลิกการโหลดได้


0

สำหรับฉันวิธีแก้ปัญหาคือdetach()ฟังก์ชันที่ฉันใช้ฟังก์ชันนั้นลงแพ็คเกจ


คุณสามารถอธิบายความหมายของ "ฉันใช้ฟังก์ชันนั้นลงแพ็กเกจ" ได้หรือไม่?
คนขี้ขลาดนิรนาม

1
ขออภัยฉันใช้ฟังก์ชัน detach () ในการดาวน์แพ็กเกจฉันมีข้อขัดแย้งระหว่างแพ็กเกจ dplyr และ knitr จากนั้นจึงใช้ฟังก์ชันสำหรับดาวน์แพ็กเกจออก ("package: knitr", unload = TRUE)
camilo lopez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.